Подтвердить что ты не робот

Частные интерфейсные методы, пример использования?

"Поддержка частных методов в интерфейсах была вкратце рассмотрена для включения в 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() по умолчанию. Это приводит к дублированию кода, что нежелательно.

Следовательно, это вызывает проблему с рефакторингом, и для удаления такого дублирования кода допускаются частные методы по умолчанию.

Спасибо, что ответили!

4b9b3361

Ответ 1

Теперь интерфейсы могут иметь методы по умолчанию. Они были добавлены таким образом, что новые методы могут быть добавлены к интерфейсам без нарушения всех классов, реализующих эти измененные интерфейсы.

Если для совместного использования кода необходимы два метода по умолчанию, метод частного интерфейса позволит им сделать это, но без предоставления этого частного метода и всех его "деталей реализации" через интерфейс.

Ответ 2

Почему бы просто (просто = использовать Java8):

PS: из-за частного помощника невозможно в 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;
 }
}