sealed, enum или обычная иерархия
Вопрос
Когда вы выберете enum, когда sealed-иерархию, а когда открытое наследование?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
enum: фиксированный набор однотипных констант без своих данных на экземпляр
sealed: закрытый набор вариантов с разными данными
Исчерпывающий switch в обоих случаях
Открытая иерархия: расширяемость третьими сторонами, плагины
sealed и модули/пакеты: наследники в том же модуле или пакете
Что могут спросить следом
- Как sealed соотносится с паттерном Visitor?
- Можно ли sealed-иерархию сериализовать в JSON?
Разбор
Enum подходит, когда вариантов фиксированное число и они одинаковой формы: статусы, типы операций. Каждый вариант это один синглтон. Sealed-иерархия нужна, когда варианты несут разные данные: Paid(amount, date), Failed(reason), Pending. Это алгебраический тип: обработку пишу через switch с record patterns, и исчерпываемость проверяет компилятор, по сути это замена Visitor без двойной диспетчеризации. Открытое наследование оставляю для точек расширения, где наследников пишут другие команды или плагины. Ограничение sealed: наследники в том же модуле, а без модулей в том же пакете. Для JSON у Jackson есть @JsonTypeInfo и @JsonSubTypes, тип нужно явно писать в данные.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Современная Java: record, sealed»
- switch-выражение с yield
- Pattern matching
- record
- LTS-версии Java
- Фича и версия Java
- Guard в switch
- Наследование record
- Что генерирует record