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) |
| Может быть абстрактной | Нет | Да |
| Может иметь подтипы | Нет | Да |