Назначение методов 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"); } } 

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

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

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

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

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

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

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

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

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

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

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