sealed class a interface v Kotlinu — co to je, syntaxe a použití

Autor: IT Sectr Publikováno: 2026-06-20 Doba čtení: 11 min

sealed class a sealed interface v Kotlinu jsou mechanismy omezené hierarchie typů, kde jsou všechny možné podtřídy známy ve fázi kompilace. Na rozdíl od běžných abstraktních tříd sealed class zaručuje vyčerpávající zpracování všech variant ve výrazu when. Podle dokumentace JetBrains Kotlin Language Guide (2026) jsou sealed typy základem pro modelování stavů, UI obrazovek a výsledných typů v Kotlin projektech.

Hlavní body

  • sealed — omezená hierarchie, kde jsou všechny podtřídy známy při kompilaci
  • when — vyčerpávající zpracování všech podtříd bez povinného else bloku
  • sealed interface — přidán v Kotlin 1.5 pro flexibilní hierarchie bez omezení dědičnosti
  • Kompilace — chyba kompilace při neúplném when pro sealed typy
  • Hierarchie — všechny podtřídy musí být ve stejném souboru nebo uvnitř sealed třídy

Co je sealed class a sealed interface?

sealed class je abstraktní třída s omezením: všechny její přímé podtřídy musí být deklarovány ve stejném souboru jako sealed class. Toto omezení činí hierarchii uzavřenou (sealed) — žádný kód mimo soubor nemůže přidat novou podtřídu.

sealed interface, přidaný v Kotlin 1.5, poskytuje stejnou záruku s flexibilitou rozhraní: sealed interface může být implementován více třídami, objekty nebo jinými rozhraními v jednom souboru. Na rozdíl od sealed class nemá sealed interface omezení jednoduché dědičnosti — třída může implementovat více sealed rozhraní současně.

Podle Kotlin Evolution and Roadmap (2026) byl sealed interface přidán na žádost komunity pro flexibilnější modelování. Hlavní motivací byla možnost kombinovat nezávislé hierarchie typů bez vícenásobné dědičnosti tříd.

Syntaxe sealed class

Deklarace sealed class začíná modifikátorem sealed před class. Podtřídy jsou deklarovány ve stejném souboru.

kotlin
sealed class NetworkResult {
    data class Success(val data: String) : NetworkResult()
    data class Error(val message: String) : NetworkResult()
    object Loading : NetworkResult()
}

Každá podtřída sealed class může mít vlastní vlastnosti a metody. Loading je singleton (object), Success a Error jsou data class s parametry. Kompilátor zná všechny tři varianty a kontroluje jejich úplnost při použití v when.

Vnořené sealed class

sealed třídy mohou být vnořené, vytvářejíce víceúrovňové hierarchie pro komplexní datové modely bez ztráty typové bezpečnosti.

kotlin
sealed class UiState {
    object Idle : UiState()
    object Loading : UiState()
    data class Content(val items: List<Item>) : UiState()
    data class Error(val exception: Throwable) : UiState()
}

Syntaxe sealed interface (Kotlin 1.5+)

sealed interface se deklaruje podobně jako sealed class, ale umožňuje implementaci více sealed rozhraní v jedné třídě.

kotlin
sealed interface Action
sealed interface Loggable

data class Navigate(val route: String) : Action, Loggable
data class ShowToast(val text: String) : Action
object GoBack : Action, Loggable

Třída Navigate implementuje současně dvě sealed rozhraní — Action a Loggable. Pro sealed class to není možné kvůli omezení jednoduché dědičnosti. sealed interface poskytuje flexibilitu kombinování nezávislých hierarchií.

Kdy zvolit sealed interface místo sealed class

sealed interface je vhodnější, když hierarchie nevyžaduje sdílený stav nebo konstruktor. Podle JetBrains Kotlin Guidelines (2026) by měl být sealed interface používán ve výchozím nastavení pro všechny nové hierarchie, kde není potřeba společný konstruktor, což činí kód flexibilnějším pro budoucí rozšíření.

Vyčerpávající zpracování v when

Hlavní výhodou sealed typů je vyčerpávající (exhaustive) zpracování ve výrazu when. Kompilátor kontroluje, že všechny možné podtřídy byly zohledněny.

kotlin
fun handleResult(result: NetworkResult): String = when (result) {
    is NetworkResult.Success -> "Data: ${result.data}"
    is NetworkResult.Error -> "Error: ${result.message}"
    is NetworkResult.Loading -> "Loading..."
    // else není vyžadováno — kompilátor ví, že všechny varianty jsou pokryty
}

Pokud vývojář přidá novou podtřídu do sealed hierarchie, ale zapomene ji zpracovat v when — kompilátor vyvolá chybu. To je bezpečnost na úrovni typů, která není dostupná při použití otevřených hierarchií s else větví.

Podle Google Android Developers (2026) jsou sealed třídy doporučeným způsobem modelování UI stavu v Jetpack Compose. Vyčerpávající kontrola when zabraňuje situacím, kdy vývojář nezpracoval všechny možné varianty zobrazení obrazovky.

Srovnání sealed class s enum class

enum class a sealed class jsou často zaměňovány, ale mají různé účely a možnosti.

Vlastnostsealed classenum class
InstanceVíce (data class), jedna (object)Přesně jedna na konstantu
VlastnostiRůzné pro každou podtříduStejné pro všechny konstanty
DědičnostAno (od sealed class)Ne (implicit final)
KonstruktorMůže mít parametryPouze společný pro všechny konstanty
HierarchieOmezená, sealedFixní sada konstant

Výběr mezi sealed class a enum class závisí na úloze. Pokud varianty nenesou další data — použijte enum. Pokud každá varianta obsahuje jedinečná pole — použijte sealed class nebo sealed interface.

Praktické scénáře použití

sealed typy se používají v Kotlin projektech pro řadu standardních scénářů vyžadujících modelování s typovou bezpečností.

UI stav v Jetpack Compose

Každá Compose obrazovka může mít sealed class UiState, který popisuje všechny možné stavy: Idle, Loading, Content(data), Error(exception). Výraz when zaručuje, že všechny stavy jsou zpracovány.

Výsledek síťových požadavků

NetworkResult s variantami Success, Error, Loading — standardní vzor v Kotlin projektech s Retrofit a Ktor. sealed class zajišťuje bezpečné zpracování každého výsledku požadavku.

Navigace v multi-modul projektech

sealed interface pro navigační trasy umožňuje modulům deklarovat vlastní trasy v rámci jednotné hierarchie. To eliminuje chyby s neznámými trasami ve fázi kompilace.

Podle KotlinConf (2025) tvoří sealed class a sealed interface základ type-safe návrhu v moderních Kotlin aplikacích. Kombinují se s data class pro modelování komplexních doménových struktur bez ztráty bezpečnosti ve fázi kompilace.

Často kladené otázky

Kde musí být deklarovány podtřídy sealed class?

Všechny přímé podtřídy sealed class musí být deklarovány ve stejném souboru. Pro sealed interface platí stejné pravidlo — implementace v jednom souboru.

Může mít sealed interface implementace v jiném souboru?

Ne, pravidlo jednoho souboru platí i pro sealed interface. Všechny implementace musí být v souboru, kde je sealed interface deklarován.

Jaký je rozdíl mezi sealed class a sealed interface?

sealed interface nemá stav a konstruktor, umožňuje vícenásobnou implementaci. sealed class může mít konstruktor a sdílený stav, ale třída může dědit pouze jeden sealed class.

Jak sealed třídy pomáhají ve výrazech when?

Kompilátor kontroluje úplnost when: pokud nejsou zpracovány všechny podtřídy, kód se nezkompiluje. To eliminuje runtime chyby a činí kód bezpečnějším.

Lze vytvořit sealed class s konstruktorem?

Ano, sealed class může mít konstruktor (ve výchozím nastavení private). Všechny podtřídy mohou předávat parametry tomuto konstruktoru přes super().

Shrnutí

  • sealed class — omezená hierarchie s podtřídami známými při kompilaci
  • sealed interface — flexibilní alternativa (Kotlin 1.5+) s podporou vícenásobné implementace
  • when — vyčerpávající zpracování s kontrolou kompilátoru, else není vyžadováno
  • Jeden soubor — všechny podtřídy a implementace musí být ve stejném souboru jako sealed typ
  • Modelování — UI stavy, síťové výsledky, navigace, event systémy
  • Bezpečnost — přidání nové podtřídy bez zpracování v when způsobí chybu kompilace
  • Výběr — sealed interface preferován ve výchozím nastavení, sealed class při potřebě sdíleného stavu

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také