Sealed class в Kotlin-е — что такое, зачем нужны? Можно ли наследовать один от другого? В чем отличие от Sealed interface?

Sealed class — это класс, у которого жестко ограничен список подклассов. Все наследники должны быть объявлены в том же файле, что и сам sealed class.

Зачем нужны?

  1. Типобезопасный when (exhaustiveness check — все ветки учтены)
  2. Используются в MVI, UI state, Result wrappers
  3. Можно передавать разные типы в одном параметре

Можно ли наследовать один sealed от другого?

Один sealed class может наследовать другую, но:

  • всё должно быть в одном файле
  • у всех sealed-подтипов сохраняется ограниченность — это наследование тоже контролируется

Sealed interface — что это такое?

Добавлено в Kotlin 1.5+

Похож на sealed class, но:

  • sealed interface не может иметь состояния (нет конструктора)
  • может быть реализован классом или другим интерфейсом
  • также ограничивает список реализаций

Отличия Sealed class и Sealed interface

Особенностьsealed classsealed interface
Можно хранить состояниеДа (есть поля, init, body)Нет
Может иметь реализациюДаНет
Можно реализовать через class и interfaceТолько classЛюбой тип
КонструкторЕстьНет
Множественная реализацияНет (одна суперкласс)Да (можно реализовать несколько интерфейсов)

Отличие от enum class

enum classsealed class / sealed interface
Число вариантовФиксированоТоже фиксировано (в одном файле)
Хранит состояниеДаДа (только у sealed class)
Может быть абстрактнойНетДа
Может иметь подтипыНетДа

Опубликовано

в

,

от

Метки: