Elvis Operator ist ein binärer Operator, der den linken Operanden zurückgibt, wenn er nicht null ist, und andernfalls den rechten. Er wird als ?: in Kotlin, Groovy und einigen anderen Sprachen geschrieben. Laut der Kotlin Language Documentation, 2024 ist der Operator Teil des Null-Sicherheitssystems der Sprache und ermöglicht es, bedingte Konstrukte ohne Verlust der Lesbarkeit auf eine Zeile zu verkürzen. Im Gegensatz zu einem vollständigen if-else-Ausdruck wertet der Elvis Operator die rechte Seite nur aus, wenn die linke Seite null ist, was bei Verwendung teurer Standardausdrücke einen Leistungsvorteil bietet.
Wichtige Punkte
Elvis Operator ist ein binärer Operator, der nach Elvis Presleys Frisur benannt ist. Das Symbol ?: erinnert visuell an das Gesicht des Sängers im Profil: Das Fragezeichen ist Auge und Kotelette, der Doppelpunkt ist der Mund. Der Operator nimmt zwei Operanden: Wenn der erste nicht null ist — wird er zurückgegeben, andernfalls der zweite. Dies ermöglicht es, eine vollständige if-else-Konstruktion durch einen einzigen kurzen Ausdruck zu ersetzen.
Der Name „Elvis Operator“ setzte sich in den Kotlin- und Groovy-Communitys durch und verbreitete sich dann auf Xtend und andere JVM-Sprachen. In Swift und Dart wird die analoge Konstruktion nil-coalescing operator genannt, ist aber funktional identisch. Die visuelle Assoziation mit Elvis Presley half dem Operator, eines der bekanntesten Symbole in der Syntax moderner Programmiersprachen zu werden.
Der Elvis Operator ist Teil des null safety-Systems, das NullPointerException (NPE) verhindert. Laut einer JetBrains-Studie von 2023 macht NPE 28% aller Ausnahmen in JVM-Produktionscode aus. Die Verwendung des Elvis Operators eliminiert NPE am Zuweisungspunkt vollständig und garantiert einen Standardwert. In Kombination mit dem sicheren Aufrufoperator ?. entsteht eine zuverlässige Kette ohne einen einzigen if-Block.
In Kotlin wird der Elvis Operator als ?: zwischen zwei Ausdrücken geschrieben. Wenn der linke Ausdruck nicht null ist — ist das Ergebnis gleich dem linken Ausdruck, andernfalls wird der rechte ausgewertet. Der rechte Ausdruck wird faul ausgewertet — nur wenn der linke Operand null ist, was bei Verwendung teurer Berechnungen oder API-Aufrufe für die Leistung wichtig ist.
val name: String? = getUserName()
val displayName = name ?: "Guest"
fun getLength(str: String?): Int {
return str?.length ?: 0
}
val config: Config? = loadConfig()
val timeout = config?.timeout ?: 30
println("Timeout: $timeout")
// Elvis with throw für erforderliche Parameter
val requiredId = nullableId ?: throw IllegalArgumentException("ID is required")
// Elvis with return für frühen Ausstieg
fun process(data: String?): Result {
val safe = data ?: return Result.failure("No data")
return processInternal(safe)
}
Kombination mit let ist ein häufiges Muster in Kotlin, bei dem der Elvis Operator einen Standardwert bereitstellt und let eine Aktion auf dem nicht-null Ergebnis ausführt. Dieser Ansatz ersetzt ganze if-else-Blöcke durch eine einzige Aufrufkette ohne Verlust der Lesbarkeit. Der Elvis Operator kann auch mit throw verwendet werden, um bei fehlendem erforderlichen Parameter gewaltsam abzubrechen — dies ist eine idiomatische Methode zur Validierung von Eingabedaten.
Ein häufiges Muster in Kotlin ist Elvis + return. Wenn der Wert null ist, gibt die Funktion sofort ein Ergebnis zurück oder wirft eine Ausnahme. Das Elvis-mit-return-Idiom wird oft in Datentransformationsfunktionen verwendet: val processed = rawData ?: return defaultValue. Dies ist kompakter als Swifts guard let und erhöht die Verschachtelungstiefe des Codes nicht.
Elvis Operator ist kürzer als if-else und erfordert keine Wiederholung der Variablen. Vergleichen Sie: val x = a ?: b versus val x = if (a != null) a else b. Bei komplexen Ausdrücken erreicht die Code-Reduktion 60%, während die Semantik vollständig identisch ist — der Compiler kann für beide Varianten denselben Bytecode erzeugen.
| Kriterium | Elvis Operator | if-else |
|---|---|---|
| Länge | 1 Zeile, 5–10 Zeichen | 3 Zeilen, 15–30 Zeichen |
| Ausdruckswiederholung | Nein | Ja (a != null) ? a : b |
| Faule rechte Seite | Ja | Ja (elvis ist kürzer) |
| Nebenwirkungen | Nur auf der rechten Seite | In beiden Zweigen |
| Lesbarkeit | Hoch für einfache Fälle | Besser für komplexe Logik |
Der Elvis Operator ist optimal zum Zuweisen von Standardwerten, zum Verketten von Funktionsaufrufen mit sicherem Zugriff und zum Protokollieren fehlender Werte. Idiomatische Kotlin-Muster empfehlen ihn als Ersatz für if-else bei einfachen Null-Prüfungen in Ausdrücken. In Kombination mit ?. erzeugt er kompakte Ketten ohne temporäre Variablen.
if-else bleibt bei mehreren Bedingungen, wenn Nebenwirkungen ausgeführt werden müssen oder wenn beide Operanden komplexe Codeblöcke mit mehreren Operationen sind, vorzuziehen. Der Elvis Operator unterstützt keine verschachtelten Blöcke — nur einzelne Ausdrücke für jeden Operanden. Wenn die rechte Seite eine Funktion mit Nebenwirkungen aufruft, ist die Lesbarkeit von if-else höher.
Groovy verwendet genau dieselbe ?:-Syntax wie Kotlin, da beide Sprachen auf der JVM laufen und die Null-Sicherheitsphilosophie teilen. Der Operator erschien früher in Groovy — er ist seit Version 1.8, veröffentlicht 2011, in der Sprache enthalten. Groovy unterstützt auch Elvis-Zuweisung: x ?= value (nur zuweisen, wenn x null ist).
def name = getUserName()
def display = name ?: "Guest"
def map = ["key": "value"]
def result = map?.get("missing") ?: "default"
println(result)
// Elvis-Zuweisung in Groovy
def config = null
config ?= "defaultConfig"
assert config == "defaultConfig"
In Swift heißt das Äquivalent nil-coalescing operator und wird als ?? geschrieben. In Dart wird dieselbe ??-Syntax verwendet. Der Unterschied besteht darin, dass Swift und Dart eine Übereinstimmung der Operandentypen erfordern, während Kotlin unterschiedliche Typen mit automatischer Konvertierung zu einem gemeinsamen Supertyp erlaubt. In TypeScript erschien der ??-Operator (nullish coalescing) in Version 3.7 und funktioniert nur mit null und undefined, im Gegensatz zu ||, das alle falsy-Werte filtert. In PHP erschien der ??-Operator in Version 7.0, in C# — ?? seit Version 6.0.
Der häufigste Fehler ist die Verwechslung des Elvis Operator ?: mit dem sicheren Aufrufoperator ?. In Kotlin ruft ?. eine Methode oder Eigenschaft nur auf, wenn das Objekt nicht null ist, während ?: bei null einen Standardwert zurückgibt. Sie werden sequenziell kombiniert, aber jeder erfüllt seine eigene Funktion. Die Verwirrung entsteht bei Anfängern, die versuchen, ?: ohne ?. davor zu verwenden.
Die rechte Seite von Elvis wird faul ausgewertet, aber wenn sie einen Funktionsaufruf mit Nebenwirkungen enthält, kann dies zu unerwartetem Verhalten führen. Entwickler platzieren manchmal teure Berechnungen oder Protokollierung auf der rechten Seite, die bei nicht-null Wert nicht ausgeführt wird. Es ist wichtig zu bedenken, dass die rechte Seite ein Ausdruck ist, der nur bei Bedarf ausgewertet wird.
Mehrere Elvis hintereinander können das Lesen des Codes erschweren. Beispielsweise wird a ?: b ?: c ?: d von links nach rechts ausgewertet und gibt den ersten nicht-null zurück. Gruppierung durch Klammern oder das Auslagern der Logik in eine separate Funktion verbessert die Lesbarkeit und erleichtert das Debugging. Wenn die Kette länger als 3 Elemente ist, sollte ein when-Ausdruck oder eine Hilfsfunktion verwendet werden.
Anfänger versuchen manchmal, den Elvis Operator zur Überprüfung von booleschen Werten zu verwenden: val x = flag ?: false. Dies funktioniert nur, wenn flag null sein kann. Für boolesche Bedingungen ohne null wird ein normales if-else oder ein ternärer Operator benötigt — Kotlin hat keinen ternären Operator, aber er wird durch den if-else-Ausdruck ersetzt: val x = if (flag) a else b.
Häufig gestellte Fragen
Elvis Operator prüft nur auf null, während der ternäre Operator jede boolesche Bedingung akzeptiert. Kotlin hat keinen ternären Operator — er wird durch den if-else-Ausdruck ersetzt. Elvis löst eine spezifische Aufgabe: einen Standardwert bei null, während der ternäre Operator alle bedingten Ausdrücke abdeckt.
Ja, die rechte Seite kann ein Funktionsaufruf sein: val x = a ?: calculateDefault(). Die Funktion wird dank fauler Auswertung nur ausgewertet, wenn a null ist. Dies ermöglicht die Verwendung teurer Berechnungen, API-Aufrufe oder Datenbankabfragen ohne Leistungseinbußen, wenn ein Wert vorhanden ist.
Java hat keinen direkten Elvis Operator. Ab Java 8 kann Optional.ofNullable(value).orElse(default) verwendet werden. Java 14+ führte switch-Ausdrücke ein, aber ein vollständiges ?: fehlt. Kotlin und Groovy bieten ihn als eingebaute syntaktische Konstruktion der Sprache.
Das typische Muster ist ein sicherer Aufruf ?. gefolgt von Elvis. Beispiel: user?.address?.city ?: „Unknown“. Wenn irgendein Element in der Kette null ist — wird der Standardwert zurückgegeben. Dies ist ein kompakter Ersatz für verschachtelte if-Prüfungen, der den Code im Vergleich zum traditionellen Ansatz um das 3- bis 5-fache reduziert.
Elvis Operator ist eine syntaktische Konstruktion auf Sprachebene, während orElse eine Methode von Optional in Java ist. Elvis ist faul (die rechte Seite wird nur bei null ausgewertet), während orElse immer sein Argument auswertet. Für eine faule Variante in Java gibt es orElseGet, das einen Supplier akzeptiert. Elvis ist kürzer und erfordert kein Erstellen eines Optional.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch