ProgrammationDéveloppeur Android

Comment fonctionne l'opérateur d'appel sécurisé (opérateur '?.') en Kotlin, et quand l'appliquer pour travailler avec des types nullable ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • Permet d'éviter des vérifications explicites if (object != null) { ... }
  • Est une alternative concise et pratique aux chaînes de vérifications imbriquées
  • Peut être utilisé avec let et l'opérateur Elvis pour gérer le cas null

Questions pièges.

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

Erreurs typiques et anti-patterns

  • Utiliser '!!' après '?.' — cela annule le sens de l'appel sécurisé, ce qui peut entraîner un NullPointerException.
  • Construire de longues chaînes '?.' sans gérer le cas null à la sortie — le résultat peut être inconfortable pour un traitement ultérieur sans vérification supplémentaire.

Exemples de la vie réelle

Cas négatif

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 :

  • Cela donne un code concis.

Inconvénients :

  • À chaque null dans la chaîne, l'application échouera avec une NullPointerException.

Cas positif

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 :

  • Protection contre les erreurs, comportement prévisible, lisibilité.

Inconvénients :

  • Il peut être difficile de diagnostiquer à quelle étape de la chaîne un null est survenu sans journaux supplémentaires.