"Поддержка частных методов в интерфейсах была вкратце рассмотрена для включения в Java SE 8 в рамках усилий по добавлению поддержки Lambda Expressions, но была снята, чтобы лучше сосредоточиться на более приоритетных задачах для 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(Params)
в обоих методах. Однако, если мы сделаем это так (метод по умолчанию), то initializeMyClass(Params)
станет частью открытого интерфейса! Чтобы этого не произошло, мы можем сохранить код цели initializeMyClass(Params)
только в методах createMyClass()
по умолчанию. Это приводит к дублированию кода, что нежелательно.
Следовательно, это вызывает проблему с рефакторингом, и для удаления такого дублирования кода допускаются частные методы по умолчанию.
Спасибо, что ответили!