Sobes.tech
Middle

Mi az a 'sealed' osztály Kotlinban, és milyen esetekben kell őket használni?

sobes.tech MI

Válasz az MI-től

A sealed osztályt arra használják, hogy korlátozott osztályhierarchiát képviseljen. Minden közvetlen származtatott típusnak ugyanabban a fájlban kell lennie, mint a sealed osztály, vagy ugyanabban a modulban (Kotlin 1.5+ esetén). Ez lehetővé teszi a fordítónak, hogy ellenőrizze, hogy minden lehetséges altípus kezelve van-e a when kifejezésben, így az kimerítővé válik else ág nélkül.

Fő jellemzők:

  • Minden közvetlen származtatott osztálynak helyi kell lennie.
  • A sealed osztály konstruktorja alapértelmezés szerint private.
  • A sealed osztály nem lehet absztrakt.
  • Nem engedélyezi példányok létrehozását.

Használati esetek:

  • Korlátozott állapotok vagy eredmények halmazának ábrázolása. Például, 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>()
    }
    
  • A változatok kezelés when kifejezésben, teljes körűség garanciával.
    fun processResult(result: Result<String>) {
       when (result) {
          is Result.Success -> println("Kapott adatok: ${result.data}")
          is Result.Error -> println("Hiba: ${result.message}")
          Result.Loading -> println("Betöltés...")
       }
       // Nincs szükség `else` ágra, mivel a fordító minden altípust ismer.
    }
    
  • Használható az enumerációk helyettesítésére, adatok inkapszulálásának lehetőségével minden változatban.

Összehasonlítás az enum osztályokkal:

Jellemzők enum class sealed class
Példák Korlátozott számú névvel ellátott konstans Korlátozott típusok halmaza
Adatok a változatokban Nem (csak tulajdonságok) Igen (alosztályokon keresztül)
Absztrakt tagok Nem Igen
Öröklődés Nem Igen, de csak ugyanabban a fájlban/modulban