Študijné materiály

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 when nad sealed triedou je úplný (exhaustive), nemusíme písať else vetvu.

16.1.1 Sealed vs Enum

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()
}

16.1.2 When s sealed triedou

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.

Úlohy

Úloha 1

Vytvor sealed triedu StavObjednavky so stavmi vytváranie, odoslaná a zlyhanie so správou.

Úloha 2

Spracuj všetky stavy v when bez vetvy else.

Úloha 3

Doplň jeden stav s vlastnými dátami a vypíš ich pri jeho spracovaní.