Интерфейсы, часть 3: разница с абстрактным классом



Отличия интерфейса и абстрактного класса — супер популярный вопрос на собеседовании. Во времена java 7 ответ был простой: "В интерфейсе нет реализаций".



Сейчас мир стал сложнее, и в интерфейсе есть приватные, статические и дефолтные методы с готовой реализацией. Это сближает интерфейсы с абстрактными классами.



В чём теперь разница интерфейса и абстрактного класса?



🛠 Функциональность



В абстрактный класс можно добавить многое:

▪️Конструктор

▪️Реализация экземплярных методов

▪️Нестатические поля

▪️private static поля

▪️Модификаторы final, synchronized, protected



Интерфейс сильно ограничен:

▪️Только статические поля

▪️Методам с реализацией недоступны экземплярные поля, поэтому их возможности слабее



✍🏻 Синтаксис



Абстрактный класс:

▫️ Ключевое слово extends

▫️ В имени часто содержится Abstract, Template, Base

▫️ Класс реализует не больше одного абстрактного класса



Интерфейс:

▫️ Ключевое слово implements

▫️ Класс может реализовать несколько интерфейсов

▫️ 5 лет назад интерфейсам было модно добавлять суффикс able: Iterable, Comparable. Норма сегодняшнего дня — называть интерфейс по тем же правилам, что и класс.



💫 Назначение



Абстрактный класс — шаблон класса. Вспомогательная структура, чтобы не дублировать код в классах одной иерархии.



Интерфейс описывает методы для верхнеуровнего взаимодействия с классом, модулем или системой.



⭐️ Репутация



Абстрактный класс сокращает объем необходимого кода, когда иерархия классов конечна или известна заранее. Большое количество абстрактных классов считается анти-паттерном, у такой системы плохая читаемость, и в неё сложно вносить изменения.



Интерфейс используется в большинстве паттернов GoF и принципах SOLID. Поддерживает инкапсуляцию.