Что такое sealed class в Kotlin и для чего он используется
Что проверяют
Понимаете ли вы, что это про закрытый набор вариантов и исчерпывающую проверку компилятором, а не просто про наследование.
Как отвечать
Запечатанный класс это иерархия с известным во время компиляции набором наследников: они объявлены в том же модуле и пакете. Компилятор знает их все, поэтому when по такому типу проверяется на полноту, и else не нужен.
sealed interface LoadState {
data object Loading : LoadState
data class Success(val items: List<Job>) : LoadState
data class Failure(val message: String) : LoadState
}
when (state) {
is LoadState.Loading -> showSpinner()
is LoadState.Success -> render(state.items)
is LoadState.Failure -> showError(state.message)
}Главная ценность в сопровождении: добавили четвёртый вариант, и все when без него перестают компилироваться. Это ровно то место, где обычный else молча пропустил бы новый случай в прод.
Типовые применения: состояние экрана, результат операции вместо исключений, события интерфейса.
Отличия от соседей: enum это фиксированный набор объектов без своих данных, запечатанный класс позволяет каждому варианту нести своё; обычный абстрактный класс открыт для наследников где угодно, и полнота when недостижима. С Kotlin 1.5 есть и sealed interface, что снимает ограничение одиночного наследования.
Где спотыкаются
Ставят else в when по запечатанному типу и теряют всю пользу.
Считают его аналогом enum.
Не знают, что наследники должны быть в том же модуле, и удивляются ошибке компиляции.
Объявляют class там, где вариант без данных, вместо data object.