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 :
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".
Imbrication multi-niveau de vérifications nulles via Elvis :
val title = a?.b?.c?.d?.e ?: defaultTitle
Avantages :
Inconvénients :
Décomposition explicite étape par étape, noms de variables compréhensibles :
val deepValue = a?.b val deeperValue = deepValue?.c?.d ?: default
Avantages :
Inconvénients :