Sobes.tech
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.
  • sealed klases konstruktors pēc noklusējuma ir private.
  • sealed klase 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 when izteiksmē 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
Mantošana Nav Jā, bet tikai tajā pašā failā/modulī