Назад к вопросам
Middle
223
questionbank
Что такое 'sealed' классы в Kotlin и в каких случаях их следует использовать?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
sealed класс используется для представления ограниченной иерархии классов. Все прямые наследники sealed класса должны быть определены в том же файле, что и сам sealed класс, или в тех же модулях (для Kotlin 1.5+). Это позволяет компилятору проверить, что все возможные подтипы обработаны в when выражении, делая его исчерпывающим без необходимости ветки else.
Ключевые особенности:
- Все прямые подклассы должны находиться локально.
- Конструктор
sealedкласса являетсяprivateпо умолчанию. sealedкласс не может быть абстрактным.- Не допускает создания экземпляров.
Случаи использования:
- Представление ограниченного набора состояний или результатов. Например,
Loading,Success(data),Error(message).sealed class Result<out T> { data class Success<T>(val data: T) : Result<T>() data class Error(val message: String) : Result<Nothing>() object Loading : Result<Nothing>() } - Обработка вариантов исходов в выражении
whenс гарантией исчерпывающей проверки.fun processResult(result: Result<String>) { when (result) { is Result.Success -> println("Data received: ${result.data}") is Result.Error -> println("Error: ${result.message}") Result.Loading -> println("Loading...") } // Нет необходимости в ветке else, так как компилятор знает все подтипы. } - Использование в качестве эквивалента перечислений с возможностью инкапсуляции данных в каждом варианте.
Сравнение с перечислениями (enum classes):
| Характеристика | enum class |
sealed class |
|---|---|---|
| Экземпляры | Ограниченный набор именованных констант | Ограниченный набор типов |
| Данные в вариантах | Нет (только свойства) | Да (через подклассы) |
| Абстрактные члены | Нет | Да |
| Наследование | Нет | Да, но ограничено в том же файле/модуле |