Методы частного интерфейса, пример использования?
«Поддержка частных методов в интерфейсах кратко рассматривалась для включения в Java SE 8 как часть усилий по добавлению поддержки лямбда-выражений, но была отменена, чтобы позволить лучше сосредоточиться на более приоритетных задачах для Java SE 8. Теперь предлагается, чтобы должна быть обеспечена поддержка методов закрытого интерфейса, что позволяет не абстрактным методам интерфейса обмениваться кодом между ними ».
Так говорит спецификация дляhttp://openjdk.java.net/jeps/213 и говорит в сообщении об ошибкеhttps://bugs.openjdk.java.net/browse/JDK-8071453 .
Но я не могу придумать ни одного варианта использования, где это необходимо, даже с кратким объяснением, приведенным выше. Могу ли я попросить пример, где «методы частного интерфейса» полезны с точки зрения кода?
РЕДАКТИРОВАТЬ: Таким образом, ответ заключается в том, что из-за того, как реализации по умолчанию были добавлены к интерфейсам в Java 8, могут быть случаи, когда реализации по умолчанию используют одну и ту же кодовую базу.
Например,
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;
}
}
Глупый пример, я знаю. Но скажем, что мы хотим использоватьinitializeMyClass(MyClass, Params)
в обоих методах. Однако, если мы сделаем это так (метод по умолчанию), тоinitializeMyClass(MyClass, Params)
будет частью публичного интерфейса! Чтобы этого не случилось, мы можем хранить только весь кодinitializeMyClass(MyClass, Params)
внутриcreateMyClass()
методы по умолчанию. Что приводит к дублированию кода, что нежелательно.
Поэтому это вызывает проблемы с рефакторингом, и для устранения такого дублирования кода разрешены частные методы по умолчанию.
Спасибо за ответы!