Назад к вопросам
Middle
113
questionbank

Как использовать запечатанные классы (sealed classes) для моделирования иерархий в Kotlin?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Запечатанные классы (sealed classes) используются для представления ограниченных иерархий наследования, где все возможные подклассы известны на этапе компиляции.

Основные особенности:

  • Все прямые наследники должны находиться в том же файле, что и запечатанный класс (до Kotlin 1.5). Начиная с Kotlin 1.5, они могут быть в любом файле той же компиляции.
  • Наследники запечатанного класса могут быть обычными классами, data-классами, object-декларациями или другими запечатанными классами.
  • Конструктор запечатанного класса по умолчанию приватный; другие модификаторы (public, protected, internal) не разрешены.
  • Позволяют использовать исчерпывающий (exhaustive) анализ в when-выражениях, что гарантирует обработку всех возможных вариантов и устраняет необходимость в else-ветке.

Пример использования для моделирования состояния пользовательского интерфейса:

sealed class UiState {
    object Loading : UiState() // Состояние загрузки
    data class Success(val data: String) : UiState() // Успешное получение данных
    data class Error(val message: String) : UiState() // Ошибка
}

Использование в when-выражении:

fun handleUiState(state: UiState): String {
    return when (state) {
        UiState.Loading -> "Загрузка данных..."
        is UiState.Success -> "Данные успешно загружены: ${state.data}"
        is UiState.Error -> "Ошибка: ${state.message}"
    }
}

Преимущества:

  • Безопасность типа: компилятор проверяет, что все возможные подклассы обработаны.
  • Читаемость:ชัดко показывает, какие варианты данных или состояний могут быть.
  • Удобство: упрощает работу с when-выражениями.