С появлением Java 8 в языке появилась новая возможность — использование методов по умолчанию в интерфейсах. Методы по умолчанию позволяют добавлять новые методы в интерфейсы без нарушения существующих контрактов.
Рассмотрим простой пример. Пусть есть интерфейс Animal
, который содержит метод makeSound()
. Все классы, реализующие этот интерфейс, должны реализовать этот метод. Но что, если потребуется добавить новый метод в интерфейс, например, eat()
? Все существующие классы, реализующие Animal
, сломаются, так как они не реализуют новый метод. Это проблема может быть решена с помощью методов по умолчанию.
interface Animal { void makeSound(); default void eat() { System.out.println("Eating..."); } }
Теперь все классы, реализующие Animal
, могут вызывать метод eat()
, даже если они его не реализуют.
Но возникает вопрос, когда именно стоит использовать методы по умолчанию в интерфейсах, а когда — абстрактные методы в абстрактных классах.
Абстрактные классы по-прежнему остаются полезными и имеют ряд преимуществ перед интерфейсами:
- Абстрактные классы могут иметь поля состояния, в то время как интерфейсы — нет.
- Абстрактные классы могут иметь конструкторы, в то время как интерфейсы — нет.
- Абстрактные классы могут определять методы
private
иprotected
, в то время как все методы интерфейса являютсяpublic
.
Интерфейсы с методами по умолчанию лучше подходят в тех случаях, когда требуется определить общее поведение для всех реализующих классов, не нарушая при это существующих контрактов. Абстрактные классы, в свою очередь, лучше подходят для определения скелета (шаблона) будущих классов, когда требуется наличие общих полей и методов, доступных только внутри иерархии наследования.
Добавить комментарий