web-dev-qa-db-fra.com

Méthodes d'interface privée, exemple de cas d'utilisation?

"La prise en charge des méthodes privées dans les interfaces a été brièvement envisagée pour inclusion dans Java SE 8 dans le cadre des efforts visant à ajouter la prise en charge des expressions Lambda, mais a été retirée pour permettre une meilleure concentration sur les tâches de priorité plus élevée pour Java SE 8. Il est maintenant proposé de prendre en charge les méthodes d'interface privée, permettant ainsi aux méthodes non abstraites d'une interface de partager du code entre elles. "

Ainsi dit la spécification pour http://openjdk.Java.net/jeps/21 et dit dans le rapport de bogue https://bugs.openjdk.Java.net/browse/JDK- 807145 .

Mais je ne peux pas vraiment penser à un cas d'utilisation où cela soit nécessaire, même avec la courte explication donnée ci-dessus. Puis-je demander un exemple où les "méthodes d'interface privée" sont utiles en termes de code?

EDIT: La réponse est donc qu'en raison de la façon dont les implémentations par défaut ont été ajoutées aux interfaces dans Java 8, il peut y avoir être des instances où les implémentations par défaut utilisent la même base de code.

Par exemple,

public interface MyInterface {
     default void initializeMyClass(MyClass myClass, Params params) {
         //do magical things in 100 lines of code to initialize myClass for example
     }

     default MyClass createMyClass(Params params) {
         MyClass myClass = new MyClass();
         initializeMyClass(myClass, params);
         return myClass;
     }

     default MyClass createMyClass() {
         MyClass myClass = new MyClass();
         initializeMyClass(myClass, null);
         return myClass;
     }
}

Exemple idiot, je sais. Mais disons que nous voulons utiliser initializeMyClass(MyClass, Params) dans les deux méthodes. Cependant, si nous le faisons comme ça (méthode par défaut), alors initializeMyClass(MyClass, Params) fera partie de l'interface publique! Pour éviter cela, nous ne pouvons que conserver le code de initializeMyClass(MyClass, Params) entier dans les méthodes par défaut createMyClass(). Ce qui entraîne une duplication de code, ce qui n'est pas souhaitable.

Par conséquent, cela provoque un problème de refactoring et pour supprimer une telle duplication de code, les méthodes par défaut privées sont autorisées.

Merci de répondre!

33
EpicPandaForce

Les interfaces peuvent maintenant avoir méthodes par défaut . Ceux-ci ont été ajoutés afin que de nouvelles méthodes puissent être ajoutées aux interfaces sans casser toutes les classes qui implémentent ces interfaces modifiées.

Si deux méthodes par défaut devaient partager le code, une méthode d'interface privée leur permettrait de le faire, mais sans exposer cette méthode privée et tous ses "détails d'implémentation" via l'interface.

32
mk.

Pourquoi pas simplement (simplement = en utilisant Java8):

PS: en raison de l'aide privée n'est pas possible en Java

public interface MyInterface {
 private static class Helper{
     static initializeMyClass(MyClass myClass, Params params){
         //do magical things in 100 lines of code to initialize myClass for example
     }
 }

 default MyClass createMyClass(Params params) {
     MyClass myClass = new MyClass();
     Helper.initializeMyClass(myClass, params);
     return myClass;
 }

 default MyClass createMyClass() {
     MyClass myClass = new MyClass();
     Helper.initializeMyClass(myClass, null);
     return myClass;
 }
}
6
maxim_ge

Java 9 permet de déclarer une méthode privée à l'intérieur de l'interface. En voici l'exemple.

interface myinterface {
    default void m1(String msg){
        msg+=" from m1";
        printMessage(msg);
    }
    default void m2(String msg){
        msg+=" from m2";
        printMessage(msg);
    }
    private void printMessage(String msg){
        System.out.println(msg);
    }
}
public class privatemethods implements myinterface {
    public void printInterface(){
        m1("Hello world");
        m2("new world");
    }
    public static void main(String[] args){
        privatemethods s = new privatemethods();
        s.printInterface();
    }
}

Pour cela, vous devez mettre à jour jdk jusqu'à la version 1.9.

3
Dhiral Kaniya