Achtergrond:
De Elvis-operator (?:) is geïntroduceerd in Kotlin als een beknopte en veilige manier om met nullable waarden om te gaan. Het heeft zijn naam gekregen vanwege de gelijkenis met de haarsnit van Elvis Presley, wanneer je de operator van de zijkant bekijkt. Het doel is om de sjablooncode te vermijden zoals if (a != null) a else b en om de dagelijkse ontwikkeling comfortabeler te maken.
Probleem:
Rechstreeks toegang krijgen tot een waarde die null kan zijn, leidt tot een runtime-fout (NullPointerException). Daarom is er behoefte aan een hulpmiddel dat het elegant mogelijk maakt om standaardwaarden in te voegen wanneer een variabele null blijkt te zijn.
Oplossing:
De Elvis-operator is toepasbaar op nullable types. Als de expressie links van de operator niet null is, wordt deze teruggegeven; anders wordt de expressie rechts gebruikt. Dit maakt de code compacter en veiliger.
Codevoorbeeld:
fun getLength(str: String?): Int { return str?.length ?: 0 } val result = getLength(null) // result == 0 val result2 = getLength("Hello") // result2 == 5
Belangrijkste kenmerken:
Wat gebeurt er als er rechts van de Elvis-operator een expressie met bijwerkingen staat? Wordt deze altijd uitgevoerd?
Nee! De expressie rechts wordt alleen uitgevoerd als de linkerzijde null is. Dit kan een belangrijke rol spelen als de functie bijwerkingen heeft of "kostbare" berekeningen uitvoert.
Codevoorbeeld:
var called = false val x: String? = "test" val y = x ?: run { called = true; "default" } // called zal false zijn, omdat run niet eens wordt uitgevoerd
Kan de Elvis-operator worden gebruikt om uitzonderingen te werpen?
Ja, in Kotlin kun je schrijven:
fun getLengthStrict(str: String?): Int = str?.length ?: throw IllegalArgumentException("str is null")
Als str null is, wordt er een uitzondering geworpen. Dit is een handig mechanisme voor gegevensvalidatie.
Kun je meerdere Elvis-operators achter elkaar gebruiken?
Ja, dit is een gebruikelijke aanpak voor fallback:
val name = fromDatabase ?: fromCache ?: "Unknown"
Deze expressie retourneert de eerste niet-null waarde of de string "Unknown".
Meerdere lagen van null-controle via Elvis:
val title = a?.b?.c?.d?.e ?: defaultTitle
Voordelen:
Nadelen:
Duidelijke stapgewijze decompositie, begrijpelijke variabelenamen:
val deepValue = a?.b val deeperValue = deepValue?.c?.d ?: default
Voordelen:
Nadelen: