Введение в enum и sealed в Kotlin
Ограниченный набор вариантов часто встречается в
программе: статус заказа, день недели, результат запроса,
состояние экрана. Если хранить такие значения простой
строкой или числом, легко передать лишнее значение и
пропустить его при разборе. Kotlin дает два родственных
способа описать набор заранее: enum class и
sealed class (или sealed interface).
Ключевое слово enum class перечисляет фиксированные константы
одного типа. У каждой константы одно имя в коде, все
они известны компилятору, их удобно сравнивать и
перебирать. Так описывают направления, уровни логирования,
режимы, где у варианта нет собственного набора полей или
поля одинаковы у всех констант.
Ключевое слово Sealed class тоже ограничивает круг возможных
типов, но каждый вариант может нести свои данные:
успех с текстом, ошибка с кодом, загрузка без полей.
Подтипы объявляют рядом с запечатанным типом, поэтому
компилятор знает полный список вариантов так же, как
для enum. Это удобно для ответов API, шагов мастера,
дерева выражений, где у разных веток разная форма данных.
Оба механизма сочетаются с when и проверкой
is так же, как иерархии с open class:
если перечислены все варианты, ветку else часто
можно не писать, а внутри ветки компилятор сужает тип.
Enum удобен, когда нужны только метки без своего набора
полей у каждого варианта; sealed - когда подтипы наследуют
общий запечатанный тип и несут разные данные через
data class, обычный класс или object,
по аналогии с абстрактным родителем и конкретными
наследниками. Дальше разберём enum от объявления до
entries, затем sealed class и sealed interface.