Назад к вопросам
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).