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
sealedje implicitněprivate. - Třída
sealednemůž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
whens 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 |