Введение в enum и sealed в Java
Ограниченный набор вариантов часто встречается в
программе: статус публикации, роль пользователя, ответ
сервиса, шаг мастера. Если хранить такие значения строкой
или числом, легко передать лишнее значение и пропустить
его при разборе. Java предлагает два родственных способа
описать набор заранее: перечисление enum и
запечатанные sealed class или
sealed interface.
Тип enum перечисляет фиксированные константы
одного перечисления. У каждой константы одно имя в коде,
все они известны компилятору, их удобно сравнивать и
перебирать. Так описывают статусы поста, уровни доступа,
режимы, где у варианта нет собственного набора полей или
поля одинаковы у всех констант.
Запечатанный тип тоже ограничивает круг возможных
реализаций, но каждый вариант может нести свои данные:
черновик с заголовком, опубликованный пост с датой,
архив без дополнительных полей. Разрешённые подтипы
объявляют рядом с родителем или перечисляют в
permits, поэтому компилятор знает полный список
вариантов. Это удобно для ответов API, состояний экрана
и деревьев выражений, где у разных веток разная форма
данных.
Оба механизма сочетаются с switch: если перечислены
все варианты, ветку default часто можно не писать.
Enum удобен, когда нужны только метки; sealed - когда
подтипы наследуют общий запечатанный тип и несут разные
данные через класс, record или одиночный
экземпляр. Дальше разберём enum от объявления до
values и valueOf, затем sealed-типы и
разбор вариантов в switch.