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 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.
Deklarace sealed class začíná modifikátorem sealed před class. Podtřídy jsou deklarovány ve stejném souboru.
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.
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.
sealed class UiState {
object Idle : UiState()
object Loading : UiState()
data class Content(val items: List<Item>) : UiState()
data class Error(val exception: Throwable) : UiState()
}
sealed interface se deklaruje podobně jako sealed class, ale umožňuje implementaci více sealed rozhraní v jedné třídě.
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í.
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í.
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.
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.
enum class a sealed class jsou často zaměňovány, ale mají různé účely a možnosti.
| Vlastnost | sealed class | enum class |
|---|---|---|
| Instance | Více (data class), jedna (object) | Přesně jedna na konstantu |
| Vlastnosti | Různé pro každou podtřídu | Stejné pro všechny konstanty |
| Dědičnost | Ano (od sealed class) | Ne (implicit final) |
| Konstruktor | Může mít parametry | Pouze společný pro všechny konstanty |
| Hierarchie | Omezená, sealed | Fixní 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.
sealed typy se používají v Kotlin projektech pro řadu standardních scénářů vyžadujících modelování s typovou bezpečností.
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.
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.
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
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.
Ne, pravidlo jednoho souboru platí i pro sealed interface. Všechny implementace musí být v souboru, kde je sealed interface deklarován.
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.
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.
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í
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í.
Přečtěte si také