Sobes.tech
Back to questions
Middle
151
questionbank

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

Sobes Copilot

Get answers in real time

Answer from AI

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-выражениями.