Private Schnittstellenmethoden, Anwendungsbeispiel?
"Die Unterstützung für private Methoden in Interfaces sollte kurz in Java SE 8 aufgenommen werden, um die Unterstützung für Lambda Expressions hinzuzufügen. Sie wurde jedoch zurückgezogen, um eine bessere Konzentration auf Aufgaben mit höherer Priorität für Java SE 8 zu ermöglichen. Es wird nun vorgeschlagen diese Unterstützung für private Schnittstellenmethoden wird übernommen, wodurch nicht abstrakte Methoden einer Schnittstelle Code zwischen ihnen gemeinsam nutzen können. "
So sagt die Spezifikation fürhttp: //openjdk.java.net/jeps/21 und sagt im Fehlerberichthttps: //bugs.openjdk.java.net/browse/JDK-807145 .
Aber ich kann mir wirklich keinen Anwendungsfall vorstellen, in dem dies notwendig ist, selbst mit der oben gegebenen kurzen Erklärung. Darf ich nach einem Beispiel fragen, in dem "Private Interface-Methoden" in Bezug auf Code nützlich sind?
BEARBEITEN Die Antwort lautet also, dass es aufgrund der Art und Weise, wie Standardimplementierungen zu Schnittstellen in Java 8 hinzugefügt wurden, Fälle geben kann, in denen die Standardimplementierungen dieselbe Codebasis verwenden.
Beispielsweise
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;
}
}
Silly Beispiel, ich weiß. Aber lassen Sie uns sagen, dass wir @ verwenden wollinitializeMyClass(MyClass, Params)
in beiden Methoden. Wenn wir es jedoch so machen (Standardmethode), danninitializeMyClass(MyClass, Params)
wird Teil der öffentlichen Schnittstelle! Um dies zu verhindern, können wir nur den Code des gesamten @ -Zeichens behalteinitializeMyClass(MyClass, Params)
innerhalb descreateMyClass()
Standardmethoden. Das führt zu doppelten Codes, was unerwünscht ist.
Daher führt dies zu Problemen beim Refactoring. Um solche Codeduplizierungen zu entfernen, sind private Standardmethoden zulässig.
Danke für die Antwort