Sobes.tech
Middle

Co jsou třídy 'sealed' v Kotlinu a v jakých případech je používat?

sobes.tech AI

Odpověď od AI

Třída sealed se používá k reprezentaci omezené hierarchie tříd. Všichni přímí podtypy třídy sealed musí být definováni ve stejném souboru jako samotná třída sealed nebo ve stejných modulech (pro Kotlin 1.5+). To umožňuje kompilátoru zkontrolovat, že všechny možné podtypy jsou zpracovány v výrazu when, čímž je výrazný bez nutnosti větve else.

Klíčové vlastnosti:

  • Všechny přímé podtřídy musí být lokální.
  • Konstruktor třídy sealed je implicitně private.
  • Třída sealed nemůže být abstraktní.
  • Neumožňuje vytváření instancí.

Případy použití:

  • Reprezentace omezené sady stavů nebo výsledků. Napří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>()
    }
    
  • Zpracování variant v výrazu when s garancí úplnosti.
    fun processResult(result: Result<String>) {
       when (result) {
          is Result.Success -> println("Přijatá data: ${result.data}")
          is Result.Error -> println("Chyba: ${result.message}")
          Result.Loading -> println("Načítá se...")
       }
       // Není potřeba větev `else`, protože kompilátor zná všechny podtypy.
    }
    
  • Použití jako ekvivalent výčtových typů s možností inkapsulace dat v každé variantě.

Porovnání s třídami enum:

Charakteristika enum class sealed class
Instance Omezená sada pojmenovaných konstant Omezená sada typů
Data v variantách Ne (pouze vlastnosti) Ano (přes podtřídy)
Abstraktní členové Ne Ano
Dědičnost Ne Ano, ale omezeno na stejný soubor/modul