Sobes.tech
Middle

Čo sú 'sealed' triedy v Kotlin a v akých prípadoch ich treba použiť?

sobes.tech AI

Odpoveď od AI

sealed trieda sa používa na reprezentáciu obmedzenej hierarchie tried. Všetci priame dediči sealed triedy musia byť definovaní v tom istom súbore ako samotná sealed trieda, alebo v tých istých moduloch (pre Kotlin 1.5+). To umožňuje kompilátoru overiť, že všetky možné podtypy sú spracované v when výraze, čím sa stáva úplným bez potreby vetvy else.

Kľúčové vlastnosti:

  • Všetky priame podtriedy musia byť lokálne.
  • Konštruktor sealed triedy je predvolený private.
  • sealed trieda nemôže byť abstraktná.
  • Nepovoľuje vytváranie inštancií.

Príklady použitia:

  • Reprezentácia obmedzeného súboru stavov alebo výsledkov. Napríklad, 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>()
    }
    
  • Spracovanie možností výsledkov v when výraze so zárukou úplnosti.
    fun processResult(result: Result<String>) {
       when (result) {
          is Result.Success -> println("Dáta prijaté: ${result.data}")
          is Result.Error -> println("Chyba: ${result.message}")
          Result.Loading -> println("Načítava sa...")
       }
       // Nie je potrebná vetva else, pretože kompilátor pozná všetky podtypy.
    }
    
  • Použitie ako ekvivalent enumov s možnosťou enkapsulácie dát v každom variante.

Porovnanie s enum triedami:

Charakteristika enum class sealed class
Inštancie Obmedzený počet pomenovaných konštánt Obmedzený počet typov
Dáta v variantoch Nie (len vlastnosti) Áno (cez podtriedy)
Abstraktné členy Nie Áno
Dedičnosť Nie Áno, ale obmedzené v tom istom súbore/moduli