Elvis Operator — är en binär operator som returnerar den vänstra operanden om den inte är null, och den högra annars. Den skrivs som ?: i Kotlin, Groovy och några andra språk. Enligt Kotlin Language Documentation, 2024 är operatorn en del av språkets null-säkerhetssystem och gör det möjligt att förkorta villkorskonstruktioner till en rad utan förlust av läsbarhet. Till skillnad från fullständig if-else-notering beräknar Elvis Operator den högra delen endast när det vänstra värdet är null, vilket ger en prestandafördel vid användning av dyra standarduttryck.
Huvudpunkter
Elvis Operator — en binär operator uppkallad efter Elvis Presleys frisyr. Symbolen ?: påminner visuellt om sångarens ansikte i profil: frågetecknet — öga och polisonger, kolon — mun. Operatorn tar två operander: om den första inte är null — returneras den, annars returneras den andra. Detta gör det möjligt att ersätta en fullständig if-else-konstruktion med en kort notering.
Namnet “Elvis Operator” har rotat sig i Kotlin- och Groovy-gemenskapen och har sedan överförts till Xtend och andra JVM-språk. I Swift och Dart kallas en liknande konstruktion nil-coalescing operator, men den är funktionellt identisk. Den visuella associationen med Elvis Presley har hjälpt operatorn att bli en av de mest igenkännbara symbolerna i moderna programmeringsspråks syntax.
Elvis Operator är en del av null safety-systemet som förhindrar NullPointerException (NPE). Enligt en studie från JetBrains 2023 utgör NPE 28% av alla undantag i produktionskod på JVM. Användning av Elvis Operator eliminerar helt NPE vid tilldelningspunkten och garanterar ett standardvärde. I kombination med den säkra anropsoperatorn ?. erhålls en tillförlitlig kedja utan ett enda if-block.
I Kotlin skrivs Elvis Operator som ?: mellan två uttryck. Om det vänstra uttrycket inte är null — är resultatet lika med vänster, annars beräknas det högra. Det högra uttrycket beräknas lat — endast när den vänstra operanden är null, vilket är viktigt för prestanda vid användning av dyra beräkningar eller API-anrop.
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 med throw för obligatoriska parametrar
val requiredId = nullableId ?: throw IllegalArgumentException("ID is required")
// Elvis med return för tidig retur
fun process(data: String?): Result {
val safe = data ?: return Result.failure("No data")
return processInternal(safe)
}
Kombination med let — ett vanligt mönster i Kotlin, där Elvis Operator anger ett standardvärde och let utför en åtgärd med det icke-null resultatet. Detta tillvägagångssätt ersätter hela if-else-block med en enda anropskedja utan förlust av läsbarhet. Elvis Operator kan också användas med throw för tvungen avbrott när en obligatorisk parameter saknas — detta är ett idiomatiskt sätt att validera indata.
I Kotlin är mönstret Elvis + return utbrett. Om värdet är null returnerar funktionen omedelbart ett resultat eller kastar ett undantag. Idiomet “Elvis with return” används ofta i datatransformeringsfunktioner: val processed = rawData ?: return defaultValue. Detta är mer kompakt än guard let i Swift och ökar inte kodens nästlingsdjup.
Elvis Operator är kortare än if-else och kräver inte upprepning av variabeln. Jämför: val x = a ?: b versus val x = if (a != null) a else b. Vid komplexa uttryck når kodminskningen 60%, medan semantiken är helt identisk — kompilatorn kan generera samma byte-kod för båda varianterna.
| Kriterium | Elvis Operator | if-else |
|---|---|---|
| Noteringslängd | 1 rad, 5–10 tecken | 3 rader, 15–30 tecken |
| Upprepning av uttryck | Nej | Ja (a != null) ? a : b |
| Lat höger sida | Ja | Ja (elvis kortare) |
| Biverkningar | Endast på höger sida | I båda grenarna |
| Läsbarhet | Hög för enkla fall | Bättre för komplex logik |
Elvis Operator är optimal för att tilldela ett standardvärde, anropa funktionskedjor med säker åtkomst och logga saknade värden. Idiomatiska mönster i Kotlin rekommenderar det som ersättning för if-else för enkla null-kontroller i uttryck. I kombination med ?. ger det kompakta kedjor utan temporära variabler.
if-else är att föredra vid flera villkor, när biverkningar behöver utföras eller när båda operanderna är komplexa kodblock med flera operationer. Elvis Operator stöder inte nästlade block — endast enkla uttryck för varje operand. Om den högra sidan anropar en funktion med biverkning är läsbarheten för if-else högre.
Groovy använder exakt samma ?:-syntax som Kotlin, eftersom båda språken körs på JVM och delar null-safety-filosofin. I Groovy dök operatorn upp tidigare — den fanns i språket från version 1.8, som släpptes 2011. Groovy stöder också Elvis-tilldelning: x ?= value (tilldela endast om x är null).
def name = getUserName()
def display = name ?: "Guest"
def map = ["key": "value"]
def result = map?.get("missing") ?: "default"
println(result)
// Elvis-tilldelning i Groovy
def config = null
config ?= "defaultConfig"
assert config == "defaultConfig"
I Swift kallas analogen nil-coalescing operator och skrivs som ??. I Dart används samma syntax ??. Skillnaden är att Swift och Dart kräver överensstämmelse mellan operandtyperna, medan Kotlin tillåter olika typer med automatisk konvertering till den gemensamma supertypen. I TypeScript från version 3.7 dök operatorn ?? (nullish coalescing) upp, som endast fungerar med null och undefined, till skillnad från || som filtrerar alla falsy-värden. I PHP från version 7.0 dök operatorn ?? upp, i C# — ?? från version 6.0.
Det vanligaste misstaget — att blanda ihop Elvis Operator ?: med den säkra anropsoperatorn ?. I Kotlin anropar ?. en metod eller egenskap endast om objektet inte är null, och ?: returnerar ett standardvärde vid null. De kombineras sekventiellt, men var och en utför sin egen funktion. Förvirring uppstår hos nybörjare som försöker använda ?: utan ?. framför.
Den högra delen av Elvis beräknas lat, men om den innehåller ett funktionsanrop med biverkningar kan detta leda till oväntat beteende. Utvecklare placerar ibland dyra beräkningar eller loggning i den högra delen som inte utförs när värdet inte är null. Det är viktigt att komma ihåg att den högra delen är ett uttryck som endast beräknas vid behov.
Flera Elvis efter varandra kan försvåra läsningen av kod. Till exempel a ?: b ?: c ?: d utförs från vänster till höger och returnerar den första icke-null. Gruppering med parenteser eller utbrytning av logik i en separat funktion ökar läsbarheten och underlättar felsökning. Om kedjan är längre än 3 element är det bättre att använda when-uttryck eller en hjälpfunktion.
Nybörjarutvecklare försöker ibland använda Elvis Operator för att kontrollera booleska värden: val x = flag ?: false. Detta fungerar endast om flag kan vara null. För booleska villkor utan null behövs vanlig if-else eller ternär operator, som inte finns i Kotlin, men ersätts av if-else-uttrycket: val x = if (flag) a else b.
Vanliga frågor
Elvis Operator kontrollerar endast null, medan den ternära operatorn accepterar vilket booleskt villkor som helst. I Kotlin finns ingen ternär operator — den ersätts av if-else-uttrycket. Elvis löser en specifik uppgift: standardvärde vid null, medan den ternära operatorn täcker alla villkorsuttryck.
Ja, på höger sida kan det finnas ett funktionsanrop: val x = a ?: calculateDefault(). Funktionen beräknas endast när värdet a är null tack vare lat evaluering. Detta gör det möjligt att använda dyra beräkningar, API-anrop eller databasfrågor utan prestandaförlust när värdet finns.
I Java finns ingen direkt Elvis Operator. Från Java 8 kan Optional.ofNullable(value).orElse(default) användas. I Java 14+ har switch-uttryck dykt upp, men fullständig ?: saknas. Kotlin och Groovy tillhandahåller det som en inbyggd syntaktisk konstruktion i språket.
Typiskt mönster: safe call ?. sedan Elvis. Exempel: user?.address?.city ?: "Unknown". Om något element i kedjan är null — returneras standardvärdet. Detta är en kompakt ersättning för nästlade if-kontroller som förkortar koden 3–5 gånger jämfört med traditionellt tillvägagångssätt.
Elvis Operator är en syntaktisk konstruktion på språknivå, orElse är en metod för Optional i Java. Elvis körs lat (höger sida beräknas endast vid null), orElse beräknar alltid argumentet. För den lata varianten i Java finns orElseGet som accepterar en Supplier. Elvis är kortare och kräver inte att Optional skapas.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också