De veilige aanroepoperator '?.' is een van de belangrijkste tools om om te gaan met null-waarden in Kotlin en kwam voort uit de ontwikkeling van ideeën van de taal, gericht op het verhogen van de veiligheid en het gemak van werken met potentiële ontbrekende waarden.
Achtergrond: In Java worden null-waarden vaak een bron van fouten (NullPointerException). Kotlin voerde een streng type-systeem in met een expliciete onderscheiding tussen nullable en not-nullable variabelen en introduceerde handige tools voor hun gebruik.
Probleem: Hoe kun je NullPointerException vermijden bij het werken met objecten die null kunnen zijn, zonder in te boeten op leesbaarheid en beknoptheid van de code?
Oplossing: De operator '?.' maakt het mogelijk om voorzichtig toegang te krijgen tot eigenschappen en methoden van nullable-variabelen: als het object niet null is, wordt de aanroep uitgevoerd, anders wordt null geretourneerd (of desbetreffende logica verder).
Codevoorbeeld:
val user: User? = getUser() val name = user?.name // als user != null, krijg je user.name, anders null user?.printInfo() // als user != null, wordt printInfo() aangeroepen
Belangrijke kenmerken:
Kan de veilige aanroepoperator '?.' aan de linkerkant van een toewijzing worden gebruikt?
Nee. De operator '?.' kan niet worden gebruikt voor veilige toewijzing van een eigenschap of variabele; hij wordt alleen toegepast voor toegang of aanroep. Het volgende is ongeldig:
user?.name = "Alex" // Compilatiefout
Eigenschappen kunnen veilig worden toegewezen via expliciete controle:
user?.let { it.name = "Alex" }
Wat retourneert een keten van veilige aanroepoperators bij de eerste ontmoeting met null?
Zodra een van de elementen in de keten '?.' gelijk is aan null, wordt het resultaat van de expressie null, verdere veilige aanroepen worden niet uitgevoerd.
Voorbeeld:
user?.address?.zipCode // als user of address == null, resultaat is null
Kan de veilige aanroep '?.' worden gebruikt met functies die Unit retourneren?
Ja, de aanroep zal nog steeds plaatsvinden, alleen als het object niet null is, en hij retourneert null in plaats van Unit als het object null is.
Voorbeeld:
user?.clearData() // als user == null, gebeurt er niets
Een ontwikkelaar gebruikt '!!' waar het object null kan zijn, na een lange keten van veilige aanroep:
val country = user?.address?.city?.country!!
Voordelen:
Nadelen:
De veilige aanroep wordt samen met de Elvis-operator gebruikt om een standaardwaarde te retourneren:
val country = user?.address?.city?.country ?: "Unknown"
Voordelen:
Nadelen: