Sobes.tech
Middle

Znáš třídy sealed a v čem je jejich zvláštnost?

sobes.tech AI

Odpověď od AI

Ano, znám.

Vlastností sealed tříd je, že umožňují omezit hierarchii dědičnosti. Všichni přímí podtypy sealed třídy musí být deklarováni ve stejném souboru. To zajišťuje, že kompilátor zná všechny možné podtypy, což je užitečné pro kontrolu úplnosti v výrazech when.

Příklad:

sealed class Result {
    data class Success(val message: String) : Result()
    data class Error(val code: Int, val description: String) : Result()
    object Loading : Result() // Singleton pro stav načítání
}

fun processResult(result: Result) {
    when (result) {
        is Result.Success -> println("Úspěch: ${result.message}")
        is Result.Error -> println("Chyba ${result.code}: ${result.description}")
        Result.Loading -> println("Načítání...")
        // Není potřeba else, protože kompilátor zná všechny možnosti
    }
}

Výhody:

  • Bezpečnost: Zaručuje úplnost výrazů when bez potřeby else.
  • Čitelnost: Jasně označuje omezenou sadu možných stavů nebo podtypů.
  • Kontrola: Zabraňuje nekontrolované dědičnosti zvenčí.

Rozdíl od enum class: sealed třídy mohou mít různé datové typy pro každý podtyp (například Success a Error v příkladu), zatímco prvky enum class jsou statické a mohou mít pouze určité vlastnosti, společné pro všechny. sealed třídy mohou také obsahovat instance-objekty (Loading).