Sobes.tech
Middle

Mis on 'sealed' klassid Kotlinis ja millal neid kasutada?

sobes.tech AI

Vastus AI-lt

sealed klassi kasutatakse piiratud klasside hierarhia esitamiseks. Kõik otsesed sealed klassi alamklassid peavad olema määratletud samas failis või samas modulites (Kotlin 1.5+). See võimaldab kompilaatoril kontrollida, et kõik võimalikud alamliigid on when väljendis käsitletud, muutes selle täielikuks ilma else osata.

Peamised omadused:

  • Kõik otsesed alamliigid peavad olema lokaalsed.
  • sealed klassi konstruktor on vaikimisi private.
  • sealed klass ei saa olla abstraktne.
  • Eksemplaride loomine on keelatud.

Kasutusjuhtumid:

  • Piiratud seisundite või tulemuste esitamine. Näiteks, 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>()
    }
    
  • Tulemuste variantide töötlemine when väljendis, tagades täielikkuse:
    fun processResult(result: Result<String>) {
       when (result) {
          is Result.Success -> println("Saadud andmed: ${result.data}")
          is Result.Error -> println("Viga: ${result.message}")
          Result.Loading -> println("Laadimine...")
       }
       // `else` osa pole vajalik, kuna kompilaator teab kõiki alamliike.
    }
    
  • Kasutamine enumite ekvivalendina koos andmete kapseldamisega igas variandis:

Võrdlus enum klassidega:

Omadus enum class sealed class
Näited Piiratud nimeliste konstantide kogum Piiratud tüüpide kogum
Andmed variantides Ei (ainult omadused) Jah (põhklasside kaudu)
Abstraktsed liikmed Ei Jah
Pärimine Ei Jah, aga ainult samas failis/modulis