Добавление методов или не добавление методов для взаимодействия?

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

Хорошим дизайном или лучшей практикой является использование методов по умолчанию в интерфейсе, или вышла ли Java 8 только для обеспечения большей поддержки старых API? Должны ли мы начать с использования методов по умолчанию в новых проектах Java 8?

Пожалуйста, помогите мне понять, какой хороший дизайн здесь, подробно.

Ответ 1

В предыдущем java8 вы искали версии, говоря о "разумных" способах расширения интерфейсов:

У вас есть что-то вроде:

interface Capability ...

interface AppleDealer {
  List<Apples> getApples();
}

и для получения AppleDealer существует некоторая центральная служба, например

public <T> T getCapability (Class<T> type);

Итак, ваш клиентский код будет делать:

AppleDealer dealer = service.getCapability(AppleDealer.class);

Когда возникнет необходимость в другом методе, выполните следующие действия:

interface AppleDealerV2 extends AppleDealer { ...

И клиенты, которые хотят V2, просто выполняют вызов getCapability(AppleDealerV2.class). Те, которые не заботятся, не должны изменять свой код!

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

Таким образом: добавление метода new к интерфейсу; и по умолчанию для реализации этого метода; без нарушения существующего клиентского кода - шаг огромный!

Значение: почему бы вам не использовать методы по умолчанию на существующих интерфейсах? Существующий код не волнует. Он не знает о новых дефолтных методах.

Ответ 2

Метод по умолчанию в интерфейсе имеет некоторые ограничения. Вы не можете иметь переменные данных в интерфейсе. В общем случае причины по умолчанию были добавлены по следующей причине. Скажем, в вашей предыдущей версии вы написали класс, который реализует интерфейс "A". В вашей следующей версии вы решили, что было бы неплохо добавить метод к вашему интерфейсу "A". Но вы не можете этого сделать, так как любой класс, который реализует "A", теперь не будет иметь этого дополнительного метода и, следовательно, не будет компилироваться. Это будет ОСНОВНАЯ обратная совместимость. Таким образом, в Java 8 вы можете добавить реализацию метода по умолчанию в интерфейс, чтобы все классы, которые реализовали старую версию "A", не будут разбиты, но будут отступать от реализации по умолчанию. Поэтому используйте эту функцию экономно, только если вам действительно нужно расширить существующий интерфейс.

Ответ 3

В ранних версиях Java не было возможно beacuase, у вас были абстрактные классы, чтобы использовать только конкретные и объявленные методы, но. Java 8 вводит новую функцию "Метод по умолчанию" или (Защитные методы), которая позволяет разработчику добавлять новые методы к интерфейсам без нарушения существующей реализации этого интерфейса. Он обеспечивает гибкость, позволяющую интерфейсу определить реализацию, которая будет использоваться по умолчанию в ситуации, когда конкретный класс не может обеспечить реализацию для этого метода.

Рассмотрим небольшой пример, чтобы понять, как он работает:

public interface oldInterface {
    public void existingMethod();
        default public void newDefaultMethod() {
        System.out.println("New default method"
              " is added in interface");
    }
}

Следующий класс будет успешно скомпилирован в Java JDK 8

public class oldInterfaceImpl implements oldInterface {
    public void existingMethod() {
        // existing implementation is here…
    }
}

Почему метод Defaut? Реинжиниринг существующей структуры JDK всегда очень сложна. Изменение одного интерфейса в JDK-инфраструктуре разбивает все классы, расширяющие интерфейс, что означает, что добавление любого нового метода может сломать миллионы строк кода. Поэтому методы по умолчанию введены в качестве механизма для расширения интерфейсов обратно совместимым способом.

Примечание

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

Для простого примера, если у вас есть interface Human_behaviour, вы можете использовать все действия этого интерфейса, например to_Walk(); to_Eat(), to_Love(), to_Fight() скажем, например, в каждом классе реализации уникальным образом для каждого человеческого объекта.Like

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