«Поддержка закрытых методов в интерфейсах кратко рассматривалась для включения в Java SE 8 в рамках усилий по добавлению поддержки лямбда-выражений, но была отозвана, чтобы лучше сосредоточиться на задачах с более высоким приоритетом для Java SE 8. Теперь предлагается, чтобы должна быть предпринята поддержка методов частного интерфейса, что позволит неабстрактным методам интерфейса совместно использовать код между собой».
Так говорит спецификация для http://openjdk.java.net/jeps/213 и говорится в отчет об ошибке https://bugs.openjdk.java.net/browse/JDK-8071453 а> .
Но я не могу придумать ни одного варианта использования, где это необходимо, даже с учетом приведенного выше краткого объяснения. Могу ли я попросить пример, когда «методы частного интерфейса» полезны с точки зрения кода?
EDIT: Таким образом, ответ заключается в том, что из-за того, как реализации по умолчанию были добавлены к интерфейсам в 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()
методов по умолчанию. Что приводит к дублированию кода, что нежелательно.
Следовательно, это вызывает проблемы с рефакторингом, и для устранения такого дублирования кода разрешены частные методы по умолчанию.
Спасибо за ответы!