Die Konstruktion when in Kotlin ist ein leistungsstarkes Werkzeug zur Steuerung des Programmablaufs, das die traditionelle switch-case-Struktur aus Java ersetzt hat. when wurde eingeführt, um die Ausdruckskraft zu erhöhen, Boilerplate-Code zu reduzieren und die Typsicherheit zu verbessern.
In Java ist die Konstruktion switch-case auf bestimmte Typen (Enum, int, String) beschränkt. Im Gegensatz zu Java strebten die Entwickler von Kotlin danach, bedingte Verzweigungen zu vereinfachen, sie ausdrucksvoller und sicherer zu gestalten.
Die Einschränkungen von switch-case in Java erschweren die Erweiterbarkeit und Wartbarkeit des Codes, insbesondere bei der Arbeit mit Sammlungen, dem Vergleich von Bereichen oder der Verarbeitung verschiedener Typen.
Die Konstruktion when in Kotlin ist universell: Sie funktioniert als Ausdruck (kann einen Wert zurückgeben), unterstützt bedingte Überprüfungen, Bereiche, einzelne Werte, Typen und die Kombination von Bedingungen.
fun describe(obj: Any): String = when (obj) { 1 -> "Eins" in 2..10 -> "Von zwei bis zehn" is String -> "String mit Länge ${obj.length}" else -> "Unbekannt" } val res1 = describe(1) // "Eins" val res2 = describe(5) // "Von zwei bis zehn" val res3 = describe("Kotlin") // "String mit Länge 6" val res4 = describe(42.0) // "Unbekannt"
Kann when ohne Argument verwendet werden?
Ja, when kann als Ersatz für eine lange if-else-Kette verwendet werden, wenn kein bestimmter Variablenwert überprüft werden muss.
when { x < 0 -> println("Negativ") x == 0 -> println("Null") else -> println("Positiv") }
Ist der else-Block in der Konstruktion when obligatorisch?
Der else-Block ist nicht obligatorisch, wenn alle möglichen Fälle behandelt werden, z. B. für Enum oder sealed class. Wenn jedoch die Wahrscheinlichkeit besteht, dass ein Fall unberücksichtigt bleibt, ist else notwendig, um Kompilierungsfehler zu vermeiden.
sealed class Fruit object Apple : Fruit() object Pear : Fruit() fun check(f: Fruit): String = when (f) { Apple -> "Das ist ein Apfel" Pear -> "Das ist eine Birne" // Kein else-Block, und der Compiler beschwert sich nicht — alle Varianten sind berücksichtigt }
Kann in when mehrere Werte in einem Zweig verwendet werden?
Ja, mehrere Werte können durch Kommas kombiniert werden.
when (value) { 0, 1 -> println("Null oder Eins") else -> println("Andere") }
In einem Zahlungssystem wird switch-case verwendet, um den Status einer Transaktion zu bestimmen. Bei der Hinzufügung eines neuen Statustyps wurde vergessen, das switch zu aktualisieren. Ein unbehandelter Status führt zu einem Silent-Error.
Vorteile:
Nachteile:
In Kotlin wird eine sealed class für Status und die Konstruktion when zu deren Verarbeitung verwendet. Bei der Hinzufügung eines neuen Status fordert der Compiler die Behandlung des neuen Falls an.
Vorteile:
Nachteile: