Sealed triedy sú triedy, ktoré majú obmedzenú množinu podtried. Všetky podtriedy musia byť definované v rovnakom balíku (package). Sú užitočné pre reprezentáciu finitných stavov:
sealed class Result {
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
data object Loading : Result()
}
fun handleResult(result: Result) {
when (result) {
is Result.Success -> println("Data: ${result.data}")
is Result.Error -> println("Chyba: ${result.message}")
is Result.Loading -> println("Nacitavam...")
}
}
fun main() {
handleResult(Result.Loading) // Nacitavam...
handleResult(Result.Success("Hello")) // Data: Hello
handleResult(Result.Error("Chyba")) // Chyba: Chyba
}
Keďže
whennad sealed triedou je úplný (exhaustive), nemusíme písaťelsevetvu.
Sealed triedy sú flexibilnejšie ako enum, pretože každá podtrieda môže mať vlastné atribúty a správanie:
// Enum - len hodnoty
enum class Color { RED, GREEN, BLUE }
// Sealed - kazda podtrida moze mat vlastne data
sealed class Color {
data object Red : Color()
data object Green : Color()
data object Blue : Color()
data class Custom(val r: Int, val g: Int, val b: Int) : Color()
}
Keďže when nad sealed triedou vie, aké všetky možnosti existujú, kompilátor nás upozorní ak zabudneme na nejakú vetvu:
sealed class Shape {
data class Circle(val radius: Double) : Shape()
data class Rectangle(val w: Double, val h: Double) : Shape()
}
fun area(shape: Shape) = when (shape) {
is Shape.Circle -> Math.PI * shape.radius * shape.radius
is Shape.Rectangle -> shape.w * shape.h
// Kompilator nas upozorni ak zabudneme na nieco
}
Sealed triedy boli pred Kotlin 1.5 obmedzené na vnorené triedy. Od verzie 1.5 môžu byť aj na vrchnej úrovni v súbore.
Vytvor sealed triedu StavObjednavky so stavmi vytváranie, odoslaná a zlyhanie so správou.
Spracuj všetky stavy v when bez vetvy else.
Doplň jeden stav s vlastnými dátami a vypíš ich pri jeho spracovaní.