Интерфейсы, часть 3: различия с абстрактным классом.
Отличия интерфейса и абстрактного класса — популярный вопрос на собеседовании. Во времена java 7 ответ был простой: «В интерфейсе нет реализаций методов».
В java 9 в интерфейс можно добавить приватные, статические и дефолтные методы с готовой реализацией. Это сближает интерфейсы с абстрактными классами.
❓В чём теперь разница интерфейса и абстрактного класса?
Сравним по нескольким критериям:
1️⃣ Абстрактный класс.
Можно добавить:
▪️Конструкторы.
▪️Реализацию экземплярных методов.
▪️Нестатические поля.
▪️private static поля.
▪️Модификаторы final, synchronized, protected.
🔨Использование:
Класс реализует не больше одного абстрактного класса через ключевое слово extends. В имени часто содержится Abstract, Template, Base.
✴️ Назначение:
Шаблон класса. Вспомогательная структура, чтобы не дублировать код в классах одной иерархии.
⭐️Репутация:
Средняя. Абстрактный класс сокращает объем необходимого кода, когда иерархия классов конечна или известна заранее. Большое количество абстрактных классов считается анти-паттерном, у такой системы плохая читаемость, и в неё сложно вносить изменения.
2️⃣ Интерфейс
▪️Только статические поля.
▪️Методам с реализацией недоступны экземплярные поля, поэтому их возможности слабее, чем у абстрактных методов.
🔨Использование:
Класс реализует несколько интерфейсов через ключевое слово implements. 5 лет назад интерфейсам было модно добавлять суффикс able: Iterable, Comparable. Норма сегодняшнего дня - называть интерфейс по тем же правилам, что и класс.
✴️ Назначение:
Описывает методы для верхнеуровнего взаимодействия с классом, модулем или системой.
⭐️Репутация:
Высокая. Широко используется в большинстве паттернов GoF, принципах SOLID. Поддерживает инкапсуляцию.
Отличия интерфейса и абстрактного класса — популярный вопрос на собеседовании. Во времена java 7 ответ был простой: «В интерфейсе нет реализаций методов».
В java 9 в интерфейс можно добавить приватные, статические и дефолтные методы с готовой реализацией. Это сближает интерфейсы с абстрактными классами.
❓В чём теперь разница интерфейса и абстрактного класса?
Сравним по нескольким критериям:
1️⃣ Абстрактный класс.
Можно добавить:
▪️Конструкторы.
▪️Реализацию экземплярных методов.
▪️Нестатические поля.
▪️private static поля.
▪️Модификаторы final, synchronized, protected.
🔨Использование:
Класс реализует не больше одного абстрактного класса через ключевое слово extends. В имени часто содержится Abstract, Template, Base.
✴️ Назначение:
Шаблон класса. Вспомогательная структура, чтобы не дублировать код в классах одной иерархии.
⭐️Репутация:
Средняя. Абстрактный класс сокращает объем необходимого кода, когда иерархия классов конечна или известна заранее. Большое количество абстрактных классов считается анти-паттерном, у такой системы плохая читаемость, и в неё сложно вносить изменения.
2️⃣ Интерфейс
▪️Только статические поля.
▪️Методам с реализацией недоступны экземплярные поля, поэтому их возможности слабее, чем у абстрактных методов.
🔨Использование:
Класс реализует несколько интерфейсов через ключевое слово implements. 5 лет назад интерфейсам было модно добавлять суффикс able: Iterable, Comparable. Норма сегодняшнего дня - называть интерфейс по тем же правилам, что и класс.
✴️ Назначение:
Описывает методы для верхнеуровнего взаимодействия с классом, модулем или системой.
⭐️Репутация:
Высокая. Широко используется в большинстве паттернов GoF, принципах SOLID. Поддерживает инкапсуляцию.