Ответ вслух Senior Современная Java: record, sealed обновлено

sealed, enum или обычная иерархия

Вопрос

Когда вы выберете enum, когда sealed-иерархию, а когда открытое наследование?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Enum подходит, когда вариантов фиксированное число и они одинаковой формы: статусы, типы операций. Каждый вариант это один синглтон.

Что должно прозвучать в ответе

  • 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 ошибок.

Термины по теме