Все три варианта используются для группировки чего-то похожего. Но зачем вообще придумывали столько всего, если есть всем привычный Enum? Посмотрим на каждый вариант.
Enum — набор констант, которые обобщены по какому-то признаку. Как выглядит типичный enum:
Обратите внимание, что тут все котики одинаковые и у них у всех есть обязательный параметр color. Сделать котика более индивидуальным мы не можем.
Основной момент: тут именно константы. Мы не можем отдельно создать новый экземпляр и нового котика. Можем только присвоить значение в виде одной из константы (строчка 2).
Из плюсов: мы в любой момент можем получить все значения или проверить, входит ли какой-то котик в наш Enum через valueOf (но тут будет исключение и его надо обработать).
Sealed-классы — сначала посмотрите на всех котиков снизу. Они очень разные и у каждого котика свои параметры, но также у них у всех есть параметр color.
Тут у нас обычный абстрактный класс, где все дети (Барсик, Персик и Кейма) становятся известны во время компилирования.
Поведение очень похоже на Enum, но тут ключевое отличие, что используются не константы, а объекты. Т.е. каждый раз создаётся новый котик со своими свойствами.
И самое главное: мы можем настроить каждого котика и присвоить ему уникальные параметры, что невозможно сделать в Enum.
Sealed-интерфейсы — почти как классы, но только интерфейсы. Всё такие же уникальные и индивидуальные котики, но у них теперь нет обязательного параметра, который раньше был в конструкторе класса (мы убрали color).
Документация: https://kotlinlang.org/docs/sealed-classes.html
Дубль статей в телеграмме — https://t.me/android_junior
Мои заметки в телеграмме — https://t.me/android_junior_notes