Назад к вопросам
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-выражениями.