L'opérateur d'appel sécurisé '?.' est l'un des outils clés pour lutter contre les valeurs null en Kotlin et est apparu comme une évolution des idées du langage, orientées vers l'amélioration de la sécurité et la commodité de travail avec des valeurs potentiellement absentes.
Historique de la question : En Java, les valeurs null deviennent souvent une source d'erreurs (NullPointerException). Kotlin a introduit un système de types strict avec une distinction explicite entre les variables nullable et non-nullable, accompagnée de l'apparition d'outils pour une utilisation pratique.
Problème : Comment éviter NullPointerException lors de la manipulation d'objets pouvant être null, tout en préservant la lisibilité et la concision du code ?
Solution : L'opérateur '?.' permet d'accéder délicatement aux propriétés et méthodes des variables nullable : si l'objet n'est pas null, l'appel est effectué, sinon null est retourné (ou la logique nécessaire est appliquée ensuite).
Exemple de code :
val user: User? = getUser() val name = user?.name // si user != null, renvoie user.name, sinon null user?.printInfo() // si user != null, printInfo() est appelé
Caractéristiques clés :
L'opérateur d'appel sécurisé '?.' peut-il être utilisé à gauche de l'affectation ?
Non. L'opérateur '?.' ne peut pas être utilisé pour une affectation sécurisée de la valeur d'une propriété ou d'une variable ; il est uniquement appliqué pour l'accès ou l'appel. L'exemple suivant est incorrect :
user?.name = "Alex" // Erreur de compilation
L'affectation des propriétés peut être effectuée en toute sécurité via une vérification explicite :
user?.let { it.name = "Alex" }
Que retourne une chaîne d'opérateurs d'appel sécurisé lors de la première rencontre avec null ?
Dès qu'un des éléments de la chaîne '?.' est égal à null, le résultat de l'expression devient null, et les appels sécurisés suivants ne s'exécutent pas.
Exemple :
user?.address?.zipCode // si user ou address == null, le résultat est null
Peut-on utiliser l'appel sécurisé '?.' avec des fonctions qui retournent Unit ?
Oui, l'appel se produira uniquement si l'objet n'est pas null, et renverra null à la place de Unit si l'objet est null.
Exemple :
user?.clearData() // si user == null, rien ne se passe
Un développeur applique '!!' là où l'objet pourrait être null, après une longue chaîne d'appels sécurisés :
val country = user?.address?.city?.country!!
Avantages :
Inconvénients :
L'appel sécurisé est utilisé avec l'opérateur Elvis pour retourner une valeur par défaut :
val country = user?.address?.city?.country ?: "Unknown"
Avantages :
Inconvénients :