Что такое ключевое слово sealed?
Комментарии (3)
Ответ сгенерирован нейросетью и может содержать ошибки
Ключевое слово sealed в Kotlin
sealed — это модификатор класса в Kotlin, который создает ограниченную иерархию наследования, где все возможные подклассы должны быть объявлены в том же файле (с Kotlin 1.5 — в том же пакете или модуле). Это делает sealed классы мощным инструментом для моделирования закрытых (closed) типов данных, особенно полезных при работе с состояниями, результатами операций или дискриминированными объединениями (discriminated unions).
Основные характеристики
- Ограниченное наследование: Все подклассы
sealedкласса известны на этапе компиляции. - Автоматическое наследование: Подклассы могут быть
data class,object, или обычными классами. - Использование с
when: Компилятор может проверять исчерпываемость (exhaustiveness) выраженийwhen, если они используются как выражение (возвращают значение).
Синтаксис и пример
sealed class Result<out T> {
data class Success<T>(val data: T) : Result<T>()
data class Error(val exception: Throwable) : Result<Nothing>()
object Loading : Result<Nothing>()
}
Преимущества sealed классов
- Безопасность типов: Компилятор знает все возможные варианты, что исключает ошибки времени выполнения.
- Исчерпывающие проверки в
when:
fun handleResult(result: Result<String>) = when (result) {
is Result.Success -> println("Данные: ${result.data}")
is Result.Error -> println("Ошибка: ${result.exception}")
Result.Loading -> println("Загрузка...")
// else не требуется — все случаи обработаны
}
Если добавить новый подкласс в sealed класс, компилятор укажет на необходимость обработки этого случая во всех when выражениях.
- Четкое моделирование состояний: Идеально подходят для UI-состояний, результатов сетевых запросов, конечных автоматов.
sealed class ViewState {
object Loading : ViewState()
data class Content(val items: List<Item>) : ViewState()
data class Error(val message: String) : ViewState()
}
Отличия от enum и open классов
- vs enum:
sealedклассы позволяют хранить различные данные в каждом подклассе (какSuccess(data)), тогда как enum-константы — синглтоны без различных состояний. - vs open классов:
openклассы позволяют неограниченное наследование из любого места, что усложняет контроль за иерархией.
Эволюция в Kotlin
В Kotlin 1.5 снято ограничение на объявление подклассов в одном файле — теперь они могут быть в одном пакете или модуле. В Kotlin 1.7 появилась экспериментальная поддержка sealed interface, позволяющая создавать sealed-иерархии через интерфейсы.
Практическое применение
// Моделирование ответа API
sealed class ApiResponse {
data class Success(val data: User) : ApiResponse()
data class Failure(val error: ApiError) : ApiResponse()
object NetworkError : ApiResponse()
}
// Обработка с гарантией покрытия всех случаев
fun process(response: ApiResponse) = when (response) {
is ApiResponse.Success -> updateUI(response.data)
is ApiResponse.Failure -> showError(response.error.message)
ApiResponse.NetworkError -> showNetworkError()
}
Sealed классы — это краеугольный камень идиоматичного Kotlin, обеспечивающий типобезопасность, выразительность и удобство сопровождения кода при работе с ограниченными наборами вариантов. Их использование считается best practice для моделирования состояний в Android-приложениях, особенно в сочетании с ViewModel и StateFlow.