Sealed interface — это специальный тип интерфейса в Kotlin, позволяющий ограничить множество его реализаций в рамках одного модуля. Впервые sealed классы появились в Kotlin раньше, а sealed интерфейсы были добавлены начиная с Kotlin 1.5 как эволюция для большего контроля над типами, участвующими, например, в иерархиях состояний или обработке событий.
Ранее разработчики применяли sealed классы для ограничения наследования и создания безопасных иерархий. Однако для гибкости и поддержки структур где наследование от нескольких типов полезно, понадобились sealed интерфейсы.
Без sealed интерфейсов нельзя гибко управлять набором подклассов интерфейса. Это делает невозможным, например, исчерпывающую проверку when при обработке состояний, если всё построено на интерфейсах, а не только на абстрактных/конкретных классах.
Использование sealed interface позволяет:
Пример кода:
sealed interface Event class Click : Event class Scroll : Event fun handle(event: Event) = when(event) { is Click -> println("Click event") is Scroll -> println("Scroll event") }
Ключевые особенности:
Могут ли sealed интерфейсы иметь реализации вне файла их объявления?
Нет, реализации sealed интерфейса должны находиться в том же модуле. Это обеспечивает полную исчерпаемость и позволяет компилятору контролировать их количество.
Как sealed интерфейсы взаимодействуют с классами и объектами?
Sealed интерфейс может реализовываться как обычными, так и object-классами, а также data object (Kotlin 1.9+). Такой интерфейс может присутствовать в множественном наследовании, чего нельзя сделать с sealed классом.
sealed interface Operation object Add: Operation object Subtract: Operation
Могут sealed интерфейсы быть вложенными?
Да, можно объявлять sealed интерфейс как внутри другого sealed класса, так и поверх других интерфейсов. Главное — все реализации внутри одного модуля.
В приложении состояния UI описали просто как интерфейсы без sealed-модификатора. Забыли одну реализацию, статический анализ this не поймал; ошибка всплыла только на проде.
Плюсы:
Минусы:
Использование sealed interface для модели событий экрана. Все реализации находятся внутри одного файла модуля, компилятор уведомляет при незакрытых ветках когда в when упущен кейс.
Плюсы:
Минусы: