Как часто используются абстрактные классы
Что проверяют
Понимаете ли вы, какое место у абстрактного класса осталось после default-методов в интерфейсах и sealed-иерархий. Следом спрашивают, чем он отличается от интерфейса, кроме множественного наследования.
Как отвечать
В прикладном коде реже, чем интерфейсы: Spring внедряет зависимости по интерфейсам, с Java 8 в интерфейсе появились default-методы, с Java 9 ещё и private. Но абстрактные классы остаются там, где нужны общее состояние и защищённая логика:
- скелетные реализации JDK:
AbstractList,AbstractMap,AbstractSet. Интерфейс задаёт контракт, абстрактный класс реализует остальное через пару базовых методов: неизменяемому списку хватитgetиsize; InputStream: один абстрактныйread(), остальные методы построены на нём;HttpServletиOncePerRequestFilterиз Spring: шаблонный метод, вы переопределяетеdoGetилиdoFilterInternal, а порядок вызовов задан в базе.
Отличия, которые стоит назвать:
- состояние: поля экземпляра и конструкторы есть только у абстрактного класса, поля интерфейса всегда
public static final; - доступ:
protected-методы и поля бывают только у класса; - наследование: класс расширяет один класс и реализует сколько угодно интерфейсов;
- записи:
recordне наследует классы, поэтому база для иерархии записей может быть только интерфейсом.
С Java 17 закрытые иерархии описывают через sealed interface с записями в роли реализаций, а с Java 21 switch по такому типу проверяет полноту вариантов. Часто это заменяет абстрактную базу.
Рецепт из «Effective Java»: контракт в интерфейсе, общая реализация в абстрактном классе рядом, клиенты зависят от интерфейса.
Где спотыкаются
Утверждают, что у абстрактного класса нет конструктора. Он есть и вызывается через super(...) при создании наследника.
Вызывают переопределяемый метод из конструктора базы. В Java он выполнится до инициализации полей наследника и увидит null или ноль.
Строят BaseService с глубокой иерархией ради переиспользования кода. Любая правка базы задевает всех наследников, а композиция решила бы то же без жёсткой связи.