Sealed class
— это класс, у которого жестко ограничен список подклассов. Все наследники должны быть объявлены в том же файле, что и сам sealed class
.
Зачем нужны?
- Типобезопасный
when
(exhaustiveness check — все ветки учтены) - Используются в MVI, UI state, Result wrappers
- Можно передавать разные типы в одном параметре
Можно ли наследовать один sealed от другого?
Один sealed class
может наследовать другую, но:
- всё должно быть в одном файле
- у всех sealed-подтипов сохраняется ограниченность — это наследование тоже контролируется
Sealed interface
— что это такое?
Добавлено в Kotlin 1.5+
Похож на sealed class
, но:
sealed interface
не может иметь состояния (нет конструктора)- может быть реализован классом или другим интерфейсом
- также ограничивает список реализаций
Отличия Sealed class
и Sealed interface
Особенность | sealed class | sealed interface |
---|---|---|
Можно хранить состояние | Да (есть поля, init, body) | Нет |
Может иметь реализацию | Да | Нет |
Можно реализовать через class и interface | Только class | Любой тип |
Конструктор | Есть | Нет |
Множественная реализация | Нет (одна суперкласс) | Да (можно реализовать несколько интерфейсов) |
Отличие от enum class
enum class | sealed class / sealed interface | |
---|---|---|
Число вариантов | Фиксировано | Тоже фиксировано (в одном файле) |
Хранит состояние | Да | Да (только у sealed class) |
Может быть абстрактной | Нет | Да |
Может иметь подтипы | Нет | Да |