Middle
Mi az a 'sealed' osztály Kotlinban, és milyen esetekben kell őket használni?
sobes.tech MI
Válasz az MI-től
A sealed osztályt arra használják, hogy korlátozott osztályhierarchiát képviseljen. Minden közvetlen származtatott típusnak ugyanabban a fájlban kell lennie, mint a sealed osztály, vagy ugyanabban a modulban (Kotlin 1.5+ esetén). Ez lehetővé teszi a fordítónak, hogy ellenőrizze, hogy minden lehetséges altípus kezelve van-e a when kifejezésben, így az kimerítővé válik else ág nélkül.
Fő jellemzők:
- Minden közvetlen származtatott osztálynak helyi kell lennie.
- A
sealedosztály konstruktorja alapértelmezés szerintprivate. - A
sealedosztály nem lehet absztrakt. - Nem engedélyezi példányok létrehozását.
Használati esetek:
- Korlátozott állapotok vagy eredmények halmazának ábrázolása. Például,
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>() } - A változatok kezelés
whenkifejezésben, teljes körűség garanciával.fun processResult(result: Result<String>) { when (result) { is Result.Success -> println("Kapott adatok: ${result.data}") is Result.Error -> println("Hiba: ${result.message}") Result.Loading -> println("Betöltés...") } // Nincs szükség `else` ágra, mivel a fordító minden altípust ismer. } - Használható az enumerációk helyettesítésére, adatok inkapszulálásának lehetőségével minden változatban.
Összehasonlítás az enum osztályokkal:
| Jellemzők | enum class |
sealed class |
|---|---|---|
| Példák | Korlátozott számú névvel ellátott konstans | Korlátozott típusok halmaza |
| Adatok a változatokban | Nem (csak tulajdonságok) | Igen (alosztályokon keresztül) |
| Absztrakt tagok | Nem | Igen |
| Öröklődés | Nem | Igen, de csak ugyanabban a fájlban/modulban |