Назначение методов Default или Defender в Java 8

В Java 8 включена новая функция методы Defender, которая позволяет создавать реализацию по умолчанию в интерфейсе.

Теперь, в первую очередь, это огромный сдвиг парадигмы для всех сжатых программистов на Java. Я рассмотрел презентацию JavaOne 13, данную Brain Goetz, где он обсуждал новые реализации stream() и parallelStream() в библиотеке Collections.

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

public interface SimpleInterface {
  public void doSomeWork();

  //A default method in the interface created using "default" keyword
  default public void doSomeOtherWork(){
    System.out.println("DoSomeOtherWork implementation in the interface");
  }
}

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

Ответ 1

Помимо возможности добавления методов в интерфейс в будущих версиях, важно, чтобы interface оставался функциональным интерфейсом, даже если он имеет несколько методов.

Функциональный интерфейс имеет только один абстрактный метод, отличный от стандартного, который может быть реализован посредством выражения лямбда. Одним из примеров является интерфейс Predicate, который имеет только один абстрактный метод (test), предоставляя методы по умолчанию для отрицания Predicate или объединения его с другим Predicate. Без методов по умолчанию эти методы должны были предоставляться в другом классе утилиты, таком как класс pre-Java 8 Collections (поскольку вы не хотите отказаться от возможности реализации лямбда для такого interface).

Ответ 2

Как вы сказали, основной мотивацией было разрешение эволюции существующих интерфейсов.

Однако есть причины, по которым вы хотели бы использовать их и в новых интерфейсах:

Одной из таких причин являются методы, которые могут быть легко реализованы с использованием других (нестандартных) методов интерфейса. Использование методов default для этого уменьшает необходимость в комбинациях Foo -interface/AbstractFoo -base-реализации (см., Например, AbstractList).

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

Ответ 3

Ну, это потому, что интерфейсы слишком тесно связаны с их классы реализации. т.е. невозможно добавить метод в интерфейс, не нарушая класс-конструктор. Когда вы добавите метод в интерфейсе, все его реализованные классы должны объявить метод тело этого нового метода.

Начиная с Java 8, вещи начали становиться уродливыми. Новая функция Lambda была представьте, что это круто. Однако это невозможно. в существующих библиотеках Java, таких как пакет java.util. если ты добавьте единственный метод в список интерфейсов, он сломает все. Тебе нужно добавить его реализацию в каждый класс, который реализует List интерфейс. Представьте в реальном мире, сколько пользовательских классов изменилось бы.

Ответ 4

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

Одним из примеров, который приходит на ум, является Java MapReduce API для Hadoop, который был изменен в версии 0.20.0 для поддержки абстрактных классов по интерфейсам, поскольку они легче развиваются. Это означает, что новый метод может быть добавлен к абстрактному классу (с реализацией по умолчанию), без нарушения старых реализаций класса.

С выпуском Java 8 теперь можно также добавить метод по умолчанию в интерфейсах, что также облегчает их развитие. С добавлением метода по умолчанию к интерфейсу добавление нового метода, даже к интерфейсу, не нарушит существующий код.

Ответ 5

  • По умолчанию методы сделали возможной концепцию функционального программирования. Для кода типа функционального программирования нам нужен только один абстрактный метод.
  • Также добавление метода в интерфейсе не сделает его обязательным для всех классов, реализующих интерфейс. Упрощенная практика кодирования.