Предположим, вы работаете над очень-очень большим java-проектом. Поздравляю!!!
Проблемный сценарий
Внезапно ваш старший подходит к вашему столу и говорит: “Эй, Икс, нам нужно добавить новый метод в XYX интерфейс”.
Внутри твоего мозга
Святое дерьмо!
Невозможно, я не могу этого сделать.
Это нарушит все существующие блоки кода.
Нет, это невозможно.
Почему это невозможно?
Согласно документам oracle , интерфейс java представляет собой группу связанных методов с пустыми телами. Нравится-
interface Bicycle { // wheel revolutions per minute void changeCadence(int newValue); void changeGear(int newValue); void speedUp(int increment); void applyBrakes(int decrement); }
Предположим, уже 100 классов реализуют велосипедный интерфейс. Так, если вы хотите добавить новый метод в интерфейс велосипеда-
- Вам нужно изменить 100 классов. Заполните тело метода в каждом классе, который реализует интерфейс bicycle.
Может ли это быть приемлемым решением?
Нет, никогда.
Решение
Java 8 представила совершенно новую концепцию для преодоления этой критической ситуации.
Это метод по умолчанию
Используя ключевое слово по умолчанию, вы можете добавить метод complete в интерфейс java ( magic ), это поможет вам сохранить существующий устаревший код нетронутым.
С новым методом по умолчанию в интерфейсе велосипеда-
interface Bicycle { void changeCadence(int newValue); void changeGear(int newValue); void speedUp(int increment); void applyBrakes(int decrement); //method with body in an interface default void saveTheWord(){ System.out.println("Haha! it is a magic"); } }
Теперь вам не нужно изменять 100 существующих классов (при желании вы можете это сделать). Однако после этого момента вновь реализованные классы могут использовать/переопределять этот метод, если захотят.
Расширение Интерфейсов Которые Содержат Методы По Умолчанию
При расширении интерфейса, содержащего метод по умолчанию, можно выполнить следующие действия:
- Вообще не упоминайте метод по умолчанию, который позволяет вашему расширенному интерфейсу наследовать метод по умолчанию.
- Повторно объявите метод по умолчанию, который делает его абстрактным.
- Переопределите метод по умолчанию, который переопределяет его.
Овации
Оригинал: “https://dev.to/khabib97/legacy-interface-edo”