Middle
Kas yra 'sealed' klasės Kotlin ir kokiais atvejais jas naudoti?
sobes.tech AI
Atsakymas iš AI
sealed klasė naudojama ribotos klasės hierarchijos atvaizdavimui. Visi tiesioginiai sealed klasės paveldėtojai turi būti apibrėžti tame pačiame faile kaip ir pati sealed klasė arba to pačioje modulyje (kotlin 1.5+). Tai leidžia kompiliatoriui patikrinti, ar visi galimi pogrupiai yra apdoroti when išraiškoje, padarant ją pilną be else šakos.
Pagrindinės savybės:
- Visi tiesioginiai pogrupiai turi būti lokalūs.
sealedklasės konstruktorius yraprivatepagal numatytuosius nustatymus.sealedklasė negali būti abstrakti.- Negalima kurti egzempliorių.
Naudojimo atvejai:
- Riboto būsenų ar rezultatų atvaizdavimas. Pavyzdžiui,
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>() } - Rezultatų variantų apdorojimas
whenišraiškoje, garantuojant pilnumą:fun processResult(result: Result<String>) { when (result) { is Result.Success -> println("Gauti duomenys: ${result.data}") is Result.Error -> println("Klaida: ${result.message}") Result.Loading -> println("Įkeliamas...") } // Nereikia `else` šakos, nes kompiliatorius žino visus pogrupius. } - Naudojimas kaip enumų ekvivalentas su duomenų inkapsuliacija kiekviename variante:
Palyginimas su enum klasėmis:
| Savybė | enum class |
sealed class |
|---|---|---|
| Pavyzdžiai | Ribotas vardintų konstantų rinkinys | Ribotas tipų rinkinys |
| Duomenys variantuose | Ne (tik savybės) | Taip (per pogrupius) |
| Abstraktūs nariai | Ne | Taip |
| Paveldėjimas | Ne | Taip, bet tik tame pačiame faile/modulyje |