Back to questions
Middle
320
questionbank
Что такое 'sealed' классы в Kotlin и в каких случаях их следует использовать?
Sobes Copilot
Get answers in real time
Answer from AI
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 |
|---|---|---|
| Экземпляры | Ограниченный набор именованных констант | Ограниченный набор типов |
| Данные в вариантах | Нет (только свойства) | Да (через подклассы) |
| Абстрактные члены | Нет | Да |
| Наследование | Нет | Да, но ограничено в том же файле/модуле |