Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг
Пройдите тест, узнайте какой профессии подходите Пройти тест
10 Июл 2023
2 мин
129

Использование методов по умолчанию в интерфейсах Java 8+ и абстрактных методов

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

Содержание

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

Рассмотрим простой пример. Пусть есть интерфейс Animal, который содержит метод makeSound(). Все классы, реализующие этот интерфейс, должны реализовать этот метод. Но что, если потребуется добавить новый метод в интерфейс, например, eat()? Все существующие классы, реализующие Animal, сломаются, так как они не реализуют новый метод. Это проблема может быть решена с помощью методов по умолчанию.

interface Animal {
    void makeSound();

    default void eat() {
        System.out.println("Eating...");
    }
}

Теперь все классы, реализующие Animal, могут вызывать метод eat(), даже если они его не реализуют.

Но возникает вопрос, когда именно стоит использовать методы по умолчанию в интерфейсах, а когда — абстрактные методы в абстрактных классах.

Абстрактные классы по-прежнему остаются полезными и имеют ряд преимуществ перед интерфейсами:

  1. Абстрактные классы могут иметь поля состояния, в то время как интерфейсы — нет.
  2. Абстрактные классы могут иметь конструкторы, в то время как интерфейсы — нет.
  3. Абстрактные классы могут определять методы private и protected, в то время как все методы интерфейса являются public.

Интерфейсы с методами по умолчанию лучше подходят в тех случаях, когда требуется определить общее поведение для всех реализующих классов, не нарушая при это существующих контрактов. Абстрактные классы, в свою очередь, лучше подходят для определения скелета (шаблона) будущих классов, когда требуется наличие общих полей и методов, доступных только внутри иерархии наследования.

Добавить комментарий

Подарок
Забрать подарок