Middle
Какви са 'sealed' класовете в Kotlin и в кои случаи трябва да се използват?
sobes.tech AI
Отговор от 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("Получени данни: ${result.data}") is Result.Error -> println("Грешка: ${result.message}") Result.Loading -> println("Зареждане...") } // Не е необходим клон `else`, тъй като компилаторът знае всички подтипове. } - Използване като еквивалент на изброимите типове с възможност за капсулиране на данни във всеки вариант.
Сравнение с класовете enum:
| Характеристика | enum class |
sealed class |
|---|---|---|
| Примери | Ограничен набор от именовани константи | Ограничен набор от типове |
| Данни във варианти | Не (само свойства) | Да (чрез подкласове) |
| Абстрактни членове | Не | Да |
| Наследяване | Не | Да, но ограничено в същия файл/модул |