Middle
Kas ir 'sealed' klases Kotlin un kādos gadījumos tās jālieto?
sobes.tech AI
Atbilde no AI
sealed klase tiek izmantota ierobežotas hierarhijas pārstāvībai. Visi tiešie sealed klases apakštipi jādefinē tajā pašā failā, kur atrodas pati sealed klase, vai tajā pašā modulī (Kotlin 1.5+). Tas ļauj kompilatoram pārbaudīt, vai visi iespējamie apakštipi ir apstrādāti when izteiksmē, padarot to pilnīgu bez else zara.
Galvenās īpašības:
- Visi tiešie apakštipi jābūt lokalizētiem.
sealedklases konstruktors pēc noklusējuma irprivate.sealedklase nevar būt abstrakta.- Nav atļauts izveidot eksemplārus.
Piemērošanas gadījumi:
- Ierobežota stāvokļu vai rezultātu attēlošana. Piemēram,
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>() } - Rezultātu variāciju apstrāde
whenizteiksmē ar pilnības garantiju:fun processResult(result: Result<String>) { when (result) { is Result.Success -> println("Saņemti dati: ${result.data}") is Result.Error -> println("Kļūda: ${result.message}") Result.Loading -> println("Ielādē...") } // Nav nepieciešama `else` zars, jo kompilators zina visus apakštipus. } - Izmantošana kā ekvivalents enumiem ar datu inkapsulāciju katrā variantā:
Salīdzinājums ar enum klasēm:
| Raksturlielums | enum class |
sealed class |
|---|---|---|
| Eksemplāri | Ierobežots nosaukto konstantiņu skaits | Ierobežots tipu skaits |
| Dati variantos | Nav (tikai īpašības) | Jā (caur apakšklasēm) |
| Abstraktie locekļi | Nav | Jā |
| Mantošana | Nav | Jā, bet tikai tajā pašā failā/modulī |