Проблема
interface Automobile{ void engineStart(); void engineStop(); } class Car implements Automobile{ public void engineStart() { } public void engineStop() { } } class Bus implements Automobile{ public void engineStart() { } public void engineStop() { } }
- Просто думаю, что в будущем нам нужно добавить еще один метод в интерфейс.
- Но если мы добавим его, нам придется изменить все остальные классы, в которых реализован этот интерфейс.
Методы по умолчанию
- Чтобы преодолеть это, в Java 1.8 введены методы по умолчанию
- Принцип разделения интерфейса может быть заменен методами по умолчанию в Java.
- Это лучший вариант для изменения существующих интерфейсов без изменения реализованных классов.
- До Java 1.7 каждый метод внутри интерфейса всегда был общедоступным и абстрактным.
- В версии 1.8 также разрешены методы по умолчанию и статические методы.
- В версии 1.9 также разрешены частные методы.
- Методы по умолчанию могут быть переопределены в реализующем классе.
- Методы по умолчанию не могут быть переопределены методами класса объектов.
Решение с использованием методов Java 8 по умолчанию
interface Automobile{ default void m1(){} } interface Car{ default void m1(){} } class Mazda3 implements Automobile, Car{ public void m1() { } }
- В таких случаях вам необходимо переопределить метод по умолчанию.
- В противном случае класс Mazda3 не сможет найти, какой метод m1( ) необходимо вызвать.
Или же вы можете использовать его таким образом, также используя ключевое слово ” супер “.
interface Automobile{ default void m1(){} } interface Car{ default void m1(){} } class Mazda3 implements Automobile, Car{ public void m1() { Automobile.super.m1(); } }
Оригинал: “https://dev.to/raviyasas/default-methods-in-java-8-4b96”