ProgrammationDéveloppeur Android

Qu'est-ce que l'opérateur Elvis (?:) en Kotlin, comment et pourquoi l'utiliser ? Quels sont les nuances et les pièges qui peuvent survenir lors de son utilisation ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Historique de la question :

L'opérateur Elvis (?:) est apparu en Kotlin comme un moyen concis et sûr de traiter les valeurs nullables. Il a été nommé ainsi en raison de sa ressemblance avec la coiffure d'Elvis Presley lorsqu'on regarde l'opérateur de côté. L'objectif est de se débarrasser du code standard tel que if (a != null) a else b et de rendre le développement quotidien plus pratique.

Problème :

Accéder directement à une valeur qui peut être nulle entraîne une erreur d'exécution (NullPointerException). Il est donc nécessaire d'avoir un outil permettant d'insérer élégamment des valeurs par défaut lorsque la variable se trouve être nulle.

Solution :

L'opérateur Elvis s'applique aux types nullables. Si l'expression à gauche de l'opérateur n'est pas nulle, elle est retournée, sinon c'est l'expression à droite qui est retournée. Cela rend le code plus compact et sûr.

Exemple de code :

fun getLength(str: String?): Int { return str?.length ?: 0 } val result = getLength(null) // result == 0 val result2 = getLength("Hello") // result2 == 5

Caractéristiques clés :

  • Permet d'éviter des vérifications explicites de null
  • Peut être utilisé pour lancer des exceptions
  • S'associe idéalement avec des types nullables, des expressions et des fonctions avec des effets secondaires

Questions piégées.

Que se passe-t-il si, à droite de l'opérateur Elvis, il y a une expression avec des effets secondaires ? Cela s'exécute-t-il toujours ?

Non ! L'expression à droite n'est évaluée que si celle à gauche était nulle. Cela peut jouer un rôle important si la fonction a des effets secondaires ou des calculs "coûteux".

Exemple de code :

var called = false val x: String? = "test" val y = x ?: run { called = true; "default" } // called sera vrai false, car run ne s'exécutera même pas

Peut-on utiliser l'opérateur Elvis pour lancer des exceptions ?

Oui, en Kotlin on peut écrire :

fun getLengthStrict(str: String?): Int = str?.length ?: throw IllegalArgumentException("str est nulle")

Si str est nul, une exception sera levée. C'est un mécanisme pratique pour valider des données.

Peut-on "chaîner" plusieurs opérateurs Elvis l'un après l'autre ?

Oui, c'est une approche courante pour les fallback :

val name = fromDatabase ?: fromCache ?: "Inconnu"

Cette expression renverra la première valeur NON nulle ou la chaîne "Inconnu".

Erreurs typiques et anti-patrons

  • Chaînes complexes et longues d'opérateurs Elvis qui rendent la lecture du code difficile
  • Ignorer les effets secondaires de l'expression à droite, ce qui peut entraîner un comportement inattendu
  • Utiliser Elvis lorsque cela nécessiterait une vérification explicite de la valeur pour traiter de différentes manières

Exemple de la vie réelle

Cas négatif

Imbrication multi-niveau de vérifications nulles via Elvis :

val title = a?.b?.c?.d?.e ?: defaultTitle

Avantages :

  • Concis pour une logique simple

Inconvénients :

  • Difficile à lire
  • Difficile à déboguer si le problème n'est pas clair

Cas positif

Décomposition explicite étape par étape, noms de variables compréhensibles :

val deepValue = a?.b val deeperValue = deepValue?.c?.d ?: default

Avantages :

  • Meilleure lisibilité
  • Plus facile d'ajouter des vérifications supplémentaires ou des logs

Inconvénients :

  • Un peu plus verbeux ; cela peut sembler des étapes "superflues" pour les débutants