Middle
Šta su 'sealed' klase u Kotlinu i u kojim slučajevima ih treba koristiti?
sobes.tech АИ
Одговор од АИ
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 |
|---|---|---|
| Екземпляри | Ограничен број именованих константи | Ограничен број типова |
| Податке у варијантама | Не (само својства) | Да (преко подкласа) |
| Аутоматски чланови | Не | Да |
| Наслеђивање | Не | Да, али ограничено у истом фајлу/модулу |