Middle
Čo sú 'sealed' triedy v Kotlin a v akých prípadoch ich treba použiť?
sobes.tech AI
Odpoveď od AI
sealed trieda sa používa na reprezentáciu obmedzenej hierarchie tried. Všetci priame dediči sealed triedy musia byť definovaní v tom istom súbore ako samotná sealed trieda, alebo v tých istých moduloch (pre Kotlin 1.5+). To umožňuje kompilátoru overiť, že všetky možné podtypy sú spracované v when výraze, čím sa stáva úplným bez potreby vetvy else.
Kľúčové vlastnosti:
- Všetky priame podtriedy musia byť lokálne.
- Konštruktor
sealedtriedy je predvolenýprivate. sealedtrieda nemôže byť abstraktná.- Nepovoľuje vytváranie inštancií.
Príklady použitia:
- Reprezentácia obmedzeného súboru stavov alebo výsledkov. Napríklad,
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>() } - Spracovanie možností výsledkov v
whenvýraze so zárukou úplnosti.fun processResult(result: Result<String>) { when (result) { is Result.Success -> println("Dáta prijaté: ${result.data}") is Result.Error -> println("Chyba: ${result.message}") Result.Loading -> println("Načítava sa...") } // Nie je potrebná vetva else, pretože kompilátor pozná všetky podtypy. } - Použitie ako ekvivalent enumov s možnosťou enkapsulácie dát v každom variante.
Porovnanie s enum triedami:
| Charakteristika | enum class |
sealed class |
|---|---|---|
| Inštancie | Obmedzený počet pomenovaných konštánt | Obmedzený počet typov |
| Dáta v variantoch | Nie (len vlastnosti) | Áno (cez podtriedy) |
| Abstraktné členy | Nie | Áno |
| Dedičnosť | Nie | Áno, ale obmedzené v tom istom súbore/moduli |