Назад к вопросам
Middle
73
questionbank
Знаком ли ты с sealed классами и в чем их особенность?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Да, знаком.
Особенность sealed классов в том, что они позволяют ограничить иерархию наследования. Все прямые наследники sealed класса должны быть объявлены в том же файле. Это гарантирует, что компилятор знает все возможные подтипы, что полезно для проверки исчерпываемости в when выражениях.
Пример:
sealed class Result {
data class Success(val message: String) : Result()
data class Error(val code: Int, val description: String) : Result()
object Loading : Result() // Синглтон для состояния загрузки
}
fun processResult(result: Result) {
when (result) {
is Result.Success -> println("Успех: ${result.message}")
is Result.Error -> println("Ошибка ${result.code}: ${result.description}")
Result.Loading -> println("Загрузка...")
// Нет необходимости в else ветке, так как компилятор знает все варианты
}
}
Преимущества:
- Безопасность: Гарантированная исчерпаемость
whenвыражений без необходимостиelse. - Читаемость: Четко обозначает ограниченный набор возможных состояний или подтипов.
- Контроль: Предотвращает неконтролируемое наследование извне.
Отличие от enum class: sealed классы могут иметь разные типы данных для каждого подтипа (как Success и Error в примере), тогда как элементы enum class статичны и могут иметь только определенные свойства, общие для всех. sealed классы также могут иметь экземпляры-объекты (Loading).