Найти тему

Sealed-классы, enum и sealed-интерфейсы. Чем отличаются?

Все три варианта используются для группировки чего-то похожего. Но зачем вообще придумывали столько всего, если есть всем привычный 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