Einleitung: Tschüss, switch-case? Hallo, when!
Wenn Sie von Java, C# oder JavaScript zu Kotlin kommen, suchen Sie wahrscheinlich als Erstes nach dem vertrauten switch-case-Operator. Und hier erwartet Sie eine Überraschung: In Kotlin gibt es kein klassisches switch-case. Stattdessen bietet die Sprache ein viel leistungsfähigeres und flexibleres Werkzeug – when.
Auf Stack Overflow sammelt die Frage "How to implement switch-case statement in Kotlin" tausende Aufrufe. Das ist normal: Entwickler gewöhnen sich an bestimmte Konstrukte und suchen nach deren Äquivalenten. Aber die Wahrheit ist, dass when in Kotlin nicht einfach ein Ersatz für switch ist. Es ist seine Evolution, die unter der Haube intelligenter und schneller arbeitet.
In diesem Artikel zeigen wir nicht nur, wie man when schreibt. Wir schauen unter die Haube: Wir erfahren, in was Ihr Code kompiliert wird, warum er in manchen Szenarien schneller als switch ist und wie Sie when zu 100% nutzen.
1. Grundlegende Syntax: Von switch-case zu when
Zunächst das einfachste Beispiel. Stellen wir uns ein altes Java-Konstrukt vor:
// Javaint day = 3;String dayName;switch (day) { case 1: dayName = "Montag"; break; case 2: dayName = "Dienstag"; break; case 3: dayName = "Mittwoch"; break; default: dayName = "Unbekannter Tag";}In Kotlin sieht das so aus:
// Kotlinval day = 3val dayName = when (day) { 1 -> "Montag" 2 -> "Dienstag" 3 -> "Mittwoch" else -> "Unbekannter Tag"}Schon hier sind zwei Hauptvorteile erkennbar:
- Kein break – Kotlin verlässt den Block automatisch nach der Ausführung eines Zweigs.
- Gibt einen Wert zurück – das Ergebnis kann einer Variablen zugewiesen werden.
2. Wie funktioniert when unter der Haube: Bytecode und Optimierung
Jetzt kommt der interessante Teil. Wenn Sie when schreiben, analysiert der Kotlin-Compiler Ihre Bedingungen und wählt die optimale Ausführungsmethode. Werfen wir einen Blick in den Bytecode (ungefähr, ohne unnötige Details).
Fall 1: when mit Konstanten (wie switch-case)
Wenn Sie when mit ganzen Zahlen, Zeichenketten oder enum-Konstanten verwenden, generiert der Compiler eine Sprungtabelle (tableswitch oder lookupswitch). Dies ist derselbe Mechanismus, den Java für switch-case verwendet. Der Unterschied besteht darin, dass Kotlin dies automatisch und ohne Ihr Zutun tut.
Fall 2: when mit beliebigen Bedingungen
Wenn Sie so etwas schreiben:
when (x) { in 1..10 -> "Klein" in 11..100 -> "Mittel" else -> "Groß"}Der Compiler kann keine Sprungtabelle verwenden. Er generiert eine Kette von if-else. Aber Kotlin macht dies so effizient wie möglich: Die Bedingungen werden der Reihe nach geprüft, und sobald eine Übereinstimmung gefunden wird, wird die Ausführung beendet.
Fall 3: when ohne Argument
Das ist eine ganz eigene Magie. Wenn Sie schreiben:
when { x > 0 -> "Positiv" x < 0 -> "Negativ" else -> "Null"}Der Compiler wandelt dies in gewöhnliche if-else um. Aber die Syntax ist viel sauberer als verschachtelte if.
Fazit: Kotlin kopiert nicht einfach switch-case. Es wählt intelligent zwischen Sprungtabelle und if-else, damit Ihr Code so schnell wie möglich läuft.
3. Fortgeschrittene Möglichkeiten von when: Das, was switch nicht hat
when kann viel mehr, als nur Werte zu vergleichen. Hier sind einige Killer-Features:
3.1. Typprüfung (smart cast)
fun describe(obj: Any): String = when (obj) { is String -> "Zeichenkette der Länge ${obj.length}" // smart cast zu String is Int -> "Ganze Zahl" is List<*> -> "Liste mit ${obj.size} Elementen" else -> "Unbekannter Typ"}