Vollständige when-Ausdrücke mit Sealed Hierarchies
Schreiben Sie vollständige when-Ausdrücke, die jede Sealed-Variante abdecken.
Vollständige when-Ausdrücke mit Sealed Hierarchies ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Kotlin Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.
Vollständiges when
Ein als Ausdruck verwendeter when-Ausdruck muss vollständig sein — jeder mögliche Wert muss behandelt werden. Sealed-Hierarchien ermöglichen es dem Compiler, dies für Sie zu überprüfen.
Nicht vollständiges when bei einem offenen Typ
Bei gewöhnlichen Klassen kann der Compiler nicht alle Subtypen überprüfen — daher ist ein else-Zweig erforderlich.
open class Shape
class Circle : Shape()
class Square : Shape()
fun describe(s: Shape) = when (s) {
is Circle -> "circle"
is Square -> "square"
else -> "unknown" // required
}
fun main() { println(describe(Circle())) }Vollständiges when bei sealed
Bei einer sealed class kennt der Compiler alle Subtypen. Wenn jeder Fall abgedeckt ist, ist kein else erforderlich.
sealed class Result
class Success(val value: Int) : Result()
class Failure(val msg: String) : Result()
fun describe(r: Result) = when (r) {
is Success -> "ok: ${r.value}"
is Failure -> "err: ${r.msg}"
}
fun main() {
println(describe(Success(42)))
println(describe(Failure("nope")))
}Sealed Interface
Sealed Interfaces ermöglichen eine Vollständigkeitsprüfung, selbst wenn Klassen Mehrfachvererbung benötigen.
sealed interface Animal
class Dog : Animal
class Cat : Animal
fun speak(a: Animal) = when (a) {
is Dog -> "woof"
is Cat -> "meow"
}
fun main() {
println(speak(Dog()))
println(speak(Cat()))
}Smart Casts in Verzweigungen
Innerhalb jedes is-Zweigs führt Kotlin für die Variable automatisch einen Smart Cast auf den spezifischen Typ durch — ein manueller Cast ist nicht erforderlich.
sealed class Event
data class Click(val x: Int, val y: Int) : Event()
data class Key(val char: Char) : Event()
fun handle(e: Event) = when (e) {
is Click -> "clicked at (${e.x},${e.y})" // smart-cast
is Key -> "key=${e.char}"
}
fun main() {
println(handle(Click(10, 20)))
println(handle(Key('A')))
}Einen Fall vergessen
Wenn Sie später eine neue Variante hinzufügen, schlägt jedes vollständige when, das den sealed-Typ weiterhin als Ausdruck verwendet, bei der Kompilierung fehl — ein hervorragendes Sicherheitsnetz.
sealed class Status
object Idle : Status()
object Running : Status()
// If we add object Done : Status(), every exhaustive when must update.
fun text(s: Status): String = when (s) {
is Idle -> "idle"
is Running -> "running"
}
fun main() { println(text(Idle)) }Sealed mit Data Classes
Ein häufig verwendetes Muster: Data Classes als Varianten einer sealed-Hierarchie.
sealed class UiState {
object Loading : UiState()
data class Success(val data: List<String>) : UiState()
data class Error(val message: String) : UiState()
}
fun render(state: UiState) = when (state) {
UiState.Loading -> "loading..."
is UiState.Success -> "got ${state.data.size} items"
is UiState.Error -> "error: ${state.message}"
}
fun main() {
println(render(UiState.Loading))
println(render(UiState.Success(listOf("a", "b"))))
println(render(UiState.Error("404")))
}when als Anweisung verwenden
Bei der Verwendung als Anweisung (nicht als Ausdruck) muss when nicht vollständig sein. Sie verzichten dadurch jedoch auf das Sicherheitsnetz.
sealed class Cmd
object Start : Cmd()
object Stop : Cmd()
fun execute(c: Cmd) {
// Statement form: no error if incomplete (avoid this style)
when (c) {
Start -> println("started")
Stop -> println("stopped")
}
}
fun main() { execute(Start); execute(Stop) }Vollständigkeitsprüfung bei einer Anweisung erzwingen
Weisen Sie when einem Wert zu (oder verwenden Sie den .exhaustive-Trick), damit der Compiler alle Fälle erzwingt.
sealed class Cmd
object Start : Cmd()
object Stop : Cmd()
fun execute(c: Cmd) {
val handled: Unit = when (c) { // expression context now
Start -> println("started")
Stop -> println("stopped")
}
}
fun main() { execute(Start) }Verzweigungen mit mehreren Fällen
Gruppieren Sie Fälle durch Kommas, um für mehrere Varianten denselben Rumpf zu verwenden.
sealed class Event
class Click : Event()
class Tap : Event()
class Drag : Event()
fun isPointer(e: Event) = when (e) {
is Click, is Tap, is Drag -> true
}
fun main() { println(isPointer(Tap())) }Verschachtelte sealed-Typen
Sealed-Hierarchien können verschachtelt werden — die Vollständigkeitsprüfung funktioniert auch bei tiefen Bäumen.
sealed class Network {
sealed class Wifi : Network() {
object Open : Wifi()
data class Secured(val ssid: String) : Wifi()
}
object Cellular : Network()
}
fun describe(n: Network) = when (n) {
Network.Wifi.Open -> "open wifi"
is Network.Wifi.Secured -> "secured: ${n.ssid}"
Network.Cellular -> "cellular"
}
fun main() {
println(describe(Network.Wifi.Secured("home")))
println(describe(Network.Cellular))
}Kurztest
Was ist der wichtigste Vorteil der Verwendung von when mit sealed-Hierarchien?
Zusammenfassung
Kombinieren Sie sealed classes/interfaces mit when, um die Vollständigkeit zur Kompilierzeit zu überprüfen. Smart Casts vereinfachen die Rümpfe der Verzweigungen. Verwenden Sie when als Ausdruck (oder weisen Sie das Ergebnis zu), um die Prüfung zu erzwingen; gruppieren Sie Fälle durch Kommas und verschachteln Sie sealed-Typen für baumförmige Zustände.
Häufig gestellte Fragen
Ist die Lektion „Vollständige when-Ausdrücke mit Sealed Hierarchies“ kostenlos?
Ja — der vollständige Text von „Vollständige when-Ausdrücke mit Sealed Hierarchies“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Kotlin Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Vollständige when-Ausdrücke mit Sealed Hierarchies“?
Schreiben Sie vollständige when-Ausdrücke, die jede Sealed-Variante abdecken. Du übst Kotlin Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Kotlin Academy zu starten?
Keine Vorkenntnisse erforderlich. Kotlin Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Vollständige when-Ausdrücke mit Sealed Hierarchies“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Kotlin Academy-Lektion Code schreiben und ausführen?
Ja. Jede Kotlin Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- sealed class vs. sealed interface: Wann welche Variante verwendet wird
- Vollständige when-Ausdrücke mit Sealed Hierarchies
- UI-Zustände mit Sealed Classes modellieren
- Sealed Hierarchies verschachteln und kombinieren