Elvis Operator — is een binaire operator die de linker operand retourneert als deze niet null is, en anders de rechter. Het wordt geschreven als ?: in Kotlin, Groovy en enkele andere talen. Volgens de Kotlin Language Documentation, 2024 maakt de operator deel uit van het null-veiligheidssysteem van de taal en stelt hij in staat om voorwaardelijke constructies in te korten tot één regel zonder verlies van leesbaarheid. In tegenstelling tot een volledige if-else notatie berekent de Elvis Operator het rechterdeel alleen bij een null-waarde van links, wat een prestatievoordeel oplevert bij het gebruik van dure standaardexpressies.
Belangrijkste punten
Elvis Operator — een binaire operator vernoemd naar het kapsel van Elvis Presley. Het symbool ?: doet visueel denken aan het gezicht van de zanger in profiel: het vraagteken — oog en bakkebaarden, de dubbele punt — mond. De operator neemt twee operanden: als de eerste niet null is — wordt deze geretourneerd, anders wordt de tweede geretourneerd. Dit maakt het mogelijk om een volledige if-else constructie te vervangen door één korte notatie.
De naam „Elvis Operator“ heeft zich gevestigd in de Kotlin- en Groovy-gemeenschap en is vervolgens overgegaan naar Xtend en andere JVM-talen. In Swift en Dart wordt een vergelijkbare constructie nil-coalescing operator genoemd, maar deze is functioneel identiek. De visuele associatie met Elvis Presley heeft de operator geholpen een van de meest herkenbare symbolen in de syntaxis van moderne programmeertalen te worden.
Elvis Operator maakt deel uit van het null safety-systeem dat NullPointerException (NPE) voorkomt. Volgens een onderzoek van JetBrains uit 2023 vormt NPE 28% van alle uitzonderingen in productiecode op JVM. Het gebruik van de Elvis Operator elimineert NPE volledig op het punt van toewijzing en garandeert een standaardwaarde. In combinatie met de veilige aanroepoperator ?. ontstaat een betrouwbare keten zonder enig if-blok.
In Kotlin wordt Elvis Operator geschreven als ?: tussen twee expressies. Als de linker expressie niet null is — is het resultaat gelijk aan links, anders wordt de rechter berekend. De rechter expressie wordt lui berekend — alleen wanneer de linker operand null is, wat belangrijk is voor prestaties bij het gebruik van dure berekeningen of API-aanroepen.
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("Time-out: $timeout")
// Elvis met throw voor verplichte parameters
val requiredId = nullableId ?: throw IllegalArgumentException("ID is required")
// Elvis met return voor vroege uitgang
fun process(data: String?): Result {
val safe = data ?: return Result.failure("No data")
return processInternal(safe)
}
Combineren met let — een veelvoorkomend patroon in Kotlin, waarbij Elvis Operator een standaardwaarde instelt en let een actie uitvoert met het niet-null resultaat. Deze benadering vervangt hele if-else blokken door één aanroepketen zonder verlies van leesbaarheid. Elvis Operator kan ook worden gebruikt met throw voor geforceerde onderbreking bij afwezigheid van een verplichte parameter — dit is een idiomatische manier om invoergegevens te valideren.
In Kotlin is het patroon Elvis + return wijdverbreid. Als de waarde null is, retourneert de functie onmiddellijk een resultaat of gooit een uitzondering. Het idioom „Elvis with return“ wordt vaak gebruikt in gegevenstransformatiefuncties: val processed = rawData ?: return defaultValue. Dit is compacter dan guard let in Swift en verhoogt de nesting van code niet.
Elvis Operator is korter dan if-else en vereist geen herhaling van de variabele. Vergelijk: val x = a ?: b versus val x = if (a != null) a else b. Bij complexe expressies bereikt de codereductie 60%, terwijl de semantiek volledig identiek is — de compiler kan dezelfde bytecode voor beide varianten genereren.
| Criterium | Elvis Operator | if-else |
|---|---|---|
| Notatielengte | 1 regel, 5–10 tekens | 3 regels, 15–30 tekens |
| Herhaling van expressie | Nee | Ja (a != null) ? a : b |
| Luie rechterkant | Ja | Ja (elvis korter) |
| Bijwerkingen | Alleen aan de rechterkant | In beide takken |
| Leesbaarheid | Hoog voor eenvoudige gevallen | Beter voor complexe logica |
Elvis Operator is optimaal voor het toewijzen van een standaardwaarde, het aanroepen van functieketens met veilige toegang en het loggen van ontbrekende waarden. Idiomatische patronen in Kotlin bevelen het aan als vervanging voor if-else voor eenvoudige null-controles in expressies. In combinatie met ?. geeft het compacte ketens zonder tijdelijke variabelen.
if-else heeft de voorkeur bij meerdere voorwaarden, wanneer bijwerkingen moeten worden uitgevoerd of wanneer beide operanden complexe codeblokken met meerdere bewerkingen zijn. Elvis Operator ondersteunt geen geneste blokken — alleen enkele expressies voor elke operand. Als de rechterkant een functie met een bijwerking aanroept, is de leesbaarheid van if-else hoger.
Groovy gebruikt exact dezelfde syntaxis ?: als Kotlin, omdat beide talen op JVM draaien en de null-safety-filosofie delen. In Groovy verscheen de operator eerder — hij was in de taal vanaf versie 1.8, uitgebracht in 2011. Groovy ondersteunt ook Elvis-toewijzing: x ?= value (alleen toewijzen als x null is).
def name = getUserName()
def display = name ?: "Guest"
def map = ["key": "value"]
def result = map?.get("missing") ?: "default"
println(result)
// Elvis-toewijzing in Groovy
def config = null
config ?= "defaultConfig"
assert config == "defaultConfig"
In Swift heet de analoge nil-coalescing operator en wordt geschreven als ??. In Dart wordt dezelfde syntaxis ?? gebruikt. Het verschil is dat Swift en Dart overeenstemming van operandtypen vereisen, terwijl Kotlin verschillende typen toestaat met automatische conversie naar het gemeenschappelijke supertype. In TypeScript verscheen vanaf versie 3.7 de operator ?? (nullish coalescing), die alleen werkt met null en undefined, in tegenstelling tot || dat alle falsy-waarden filtert. In PHP verscheen vanaf versie 7.0 de operator ??, in C# — ?? vanaf versie 6.0.
De meest voorkomende fout — het verwarren van Elvis Operator ?: met de veilige aanroepoperator ?. In Kotlin roept ?. een methode of eigenschap alleen aan als het object niet null is, en ?: retourneert een standaardwaarde bij null. Ze worden opeenvolgend gecombineerd, maar elk vervult zijn eigen functie. Verwarring ontstaat bij beginners die ?: proberen te gebruiken zonder ?. ervoor.
De rechterkant van Elvis wordt lui berekend, maar als er een functieaanroep met bijwerkingen in zit, kan dit leiden tot onverwacht gedrag. Ontwikkelaars plaatsen soms dure berekeningen of logging in de rechterkant die niet wordt uitgevoerd bij een niet-null waarde. Het is belangrijk om te onthouden dat de rechterkant een expressie is die alleen wordt berekend wanneer dat nodig is.
Meerdere Elvis-operators achter elkaar kunnen het lezen van code bemoeilijken. Bijvoorbeeld a ?: b ?: c ?: d wordt van links naar rechts uitgevoerd en retourneert de eerste niet-null. Groepering door haakjes of het uitsplitsen van logica in een aparte functie verhoogt de leesbaarheid en vergemakkelijkt het debuggen. Als de keten langer is dan 3 elementen, kunt u beter een when-expressie of een hulpfunctie gebruiken.
Beginnende ontwikkelaars proberen soms de Elvis Operator te gebruiken voor het controleren van boolean waarden: val x = flag ?: false. Dit werkt alleen als flag null kan zijn. Voor boolean condities zonder null is gewoon if-else of de ternaire operator nodig, die in Kotlin niet bestaat, maar wordt vervangen door de if-else expressie: val x = if (flag) a else b.
Veelgestelde vragen
Elvis Operator controleert alleen op null, terwijl de ternaire operator elke boolean conditie accepteert. In Kotlin bestaat geen ternaire operator — deze wordt vervangen door de if-else expressie. Elvis lost één specifieke taak op: standaardwaarde bij null, terwijl de ternaire operator alle voorwaardelijke expressies dekt.
Ja, aan de rechterkant kan een functieaanroep staan: val x = a ?: calculateDefault(). De functie wordt alleen berekend bij een null-waarde van a dankzij luie evaluatie. Dit maakt het mogelijk om dure berekeningen, API-aanroepen of databasequery's te gebruiken zonder prestatieverlies wanneer de waarde bestaat.
In Java bestaat geen directe Elvis Operator. Vanaf Java 8 kan Optional.ofNullable(value).orElse(default) worden gebruikt. In Java 14+ zijn switch-expressies verschenen, maar volledige ?: ontbreekt. Kotlin en Groovy bieden het als een ingebouwde syntactische constructie van de taal.
Typisch patroon: safe call ?. gevolgd door Elvis. Voorbeeld: user?.address?.city ?: "Unknown". Als een element van de keten null is — wordt de standaardwaarde geretourneerd. Dit is een compacte vervanging voor geneste if-controles die de code 3–5 keer verkort in vergelijking met de traditionele benadering.
Elvis Operator is een syntactische constructie op taalniveau, orElse is een methode van Optional in Java. Elvis wordt lui uitgevoerd (rechterkant wordt alleen bij null berekend), orElse berekent altijd het argument. Voor een luie variant in Java bestaat orElseGet, dat een Supplier accepteert. Elvis is korter en vereist geen aanmaak van Optional.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook