Elvis Operator est un opérateur binaire qui renvoie l’opérande gauche s’il n’est pas null, et l’opérande droite dans le cas contraire. Il s’écrit ?: en Kotlin, Groovy et certains autres langages. Selon la Documentation du langage Kotlin, 2024, l’opérateur fait partie du système de sécurité null du langage et permet de réduire les constructions conditionnelles à une seule ligne sans perte de lisibilité. Contrairement à une expression if-else complète, l’Elvis Operator n’évalue la partie droite que lorsque la partie gauche est null, ce qui offre un avantage de performance lors de l’utilisation d’expressions par défaut coûteuses.
Points clés
Elvis Operator est un opérateur binaire nommé d’après la coiffure d’Elvis Presley. Le symbole ?: ressemble visuellement au visage du chanteur de profil : le point d’interrogation est l’œil et la patte, les deux points sont la bouche. L’opérateur prend deux opérandes : si le premier n’est pas null — il est renvoyé, sinon le second est renvoyé. Cela permet de remplacer une construction if-else complète par une seule expression courte.
Le nom « Elvis Operator » s’est imposé dans les communautés Kotlin et Groovy, puis s’est répandu dans Xtend et d’autres langages JVM. En Swift et Dart, la construction analogue est appelée nil-coalescing operator, mais elle est fonctionnellement identique. L’association visuelle avec Elvis Presley a aidé l’opérateur à devenir l’un des symboles les plus reconnaissables dans la syntaxe des langages de programmation modernes.
L’Elvis Operator fait partie du système null safety qui prévient les NullPointerException (NPE). Selon une étude JetBrains de 2023, les NPE représentent 28 % de toutes les exceptions dans le code JVM en production. L’utilisation de l’Elvis Operator élimine complètement les NPE au point d’affectation, garantissant une valeur par défaut. En combinaison avec l’opérateur d’appel sécurisé ?., une chaîne fiable est créée sans un seul bloc if.
En Kotlin, l’Elvis Operator s’écrit ?: entre deux expressions. Si l’expression gauche n’est pas null — le résultat est égal à l’expression gauche, sinon l’expression droite est évaluée. L’expression droite est évaluée paresseusement — uniquement lorsque l’opérande gauche est null, ce qui est important pour les performances lors de l’utilisation de calculs coûteux ou d’appels API.
val name: String? = getUserName()
val displayName = name ?: "Guest"
fun getLength(str: String?): Int {
return str?.length ?: 0
}
val config: Config? = loadConfig()
val timeout = config?.timeout ?: 30
println("Timeout: $timeout")
// Elvis with throw pour paramètres obligatoires
val requiredId = nullableId ?: throw IllegalArgumentException("ID is required")
// Elvis with return pour sortie anticipée
fun process(data: String?): Result {
val safe = data ?: return Result.failure("No data")
return processInternal(safe)
}
Combinaison avec let est un modèle courant en Kotlin, où l’Elvis Operator fournit une valeur par défaut, et let exécute une action sur le résultat non null. Cette approche remplace des blocs if-else entiers par une seule chaîne d’appels sans perte de lisibilité. L’Elvis Operator peut également être utilisé avec throw pour interrompre forcément en cas d’absence d’un paramètre obligatoire — c’est une manière idiomatique de valider les données d’entrée.
Un modèle courant en Kotlin est Elvis + return. Si la valeur est null, la fonction retourne immédiatement un résultat ou lève une exception. L’idiome Elvis avec return est souvent utilisé dans les fonctions de transformation de données : val processed = rawData ?: return defaultValue. C’est plus compact que guard let de Swift et n’augmente pas l’imbrication du code.
Elvis Operator est plus court que if-else et ne nécessite pas de répéter la variable. Comparez : val x = a ?: b versus val x = if (a != null) a else b. Avec des expressions complexes, la réduction de code atteint 60 %, tandis que la sémantique est complètement identique — le compilateur peut générer le même bytecode pour les deux variantes.
| Critère | Elvis Operator | if-else |
|---|---|---|
| Longueur | 1 ligne, 5–10 caractères | 3 lignes, 15–30 caractères |
| Répétition de l’expression | Non | Oui (a != null) ? a : b |
| Partie droite paresseuse | Oui | Oui (elvis est plus court) |
| Effets secondaires | Uniquement à droite | Dans les deux branches |
| Lisibilité | Élevée pour les cas simples | Meilleure pour une logique complexe |
L’Elvis Operator est optimal pour attribuer des valeurs par défaut, enchaîner des appels de fonctions avec accès sécurisé et journaliser les valeurs manquantes. Les modèles idiomatiques Kotlin le recommandent comme remplacement de if-else pour les vérifications null simples dans les expressions. Combiné avec ?., il produit des chaînes compactes sans variables temporaires.
if-else reste préférable pour des conditions multiples, lorsque des effets secondaires doivent être exécutés, ou lorsque les deux opérandes sont des blocs de code complexes avec plusieurs opérations. L’Elvis Operator ne prend pas en charge les blocs imbriqués — seulement des expressions uniques pour chaque opérande. Si la partie droite appelle une fonction avec des effets secondaires, la lisibilité de if-else est supérieure.
Groovy utilise exactement la même syntaxe ?: que Kotlin, car les deux langages fonctionnent sur la JVM et partagent la philosophie null-safety. L’opérateur est apparu plus tôt dans Groovy — il est présent dans le langage depuis la version 1.8, sortie en 2011. Groovy prend également en charge l’affectation Elvis : x ?= value (affecter seulement si x est null).
def name = getUserName()
def display = name ?: "Guest"
def map = ["key": "value"]
def result = map?.get("missing") ?: "default"
println(result)
// Affectation Elvis en Groovy
def config = null
config ?= "defaultConfig"
assert config == "defaultConfig"
En Swift, l’équivalent est appelé nil-coalescing operator et s’écrit ??. En Dart, la même syntaxe ?? est utilisée. La différence est que Swift et Dart exigent la correspondance des types des opérandes, tandis que Kotlin autorise des types différents avec conversion automatique vers un supertype commun. En TypeScript, l’opérateur ?? (nullish coalescing) est apparu dans la version 3.7 et fonctionne uniquement avec null et undefined, contrairement à || qui filtre toutes les valeurs falsy. En PHP, l’opérateur ?? est apparu dans la version 7.0, en C# — ?? depuis la version 6.0.
L’erreur la plus fréquente est de confondre l’Elvis Operator ?: avec l’opérateur d’appel sécurisé ?. En Kotlin, ?. appelle une méthode ou une propriété uniquement si l’objet n’est pas null, tandis que ?: retourne une valeur par défaut quand il est null. Ils sont combinés séquentiellement, mais chacun remplit sa propre fonction. La confusion survient chez les débutants qui tentent d’utiliser ?: sans ?. devant.
La partie droite d’Elvis est évaluée paresseusement, mais si elle contient un appel de fonction avec des effets secondaires, cela peut entraîner un comportement inattendu. Les développeurs placent parfois des calculs coûteux ou de la journalisation dans la partie droite, qui n’est pas exécutée lorsque la valeur n’est pas nulle. Il est important de se rappeler que la partie droite est une expression qui n’est évaluée qu’en cas de besoin.
Plusieurs Elvis à la suite peuvent compliquer la lecture du code. Par exemple, a ?: b ?: c ?: d est évalué de gauche à droite, renvoyant le premier non null. Le regroupement avec des parenthèses ou l’extraction de la logique dans une fonction séparée améliore la lisibilité et facilite le débogage. Si la chaîne a plus de 3 éléments, il faut utiliser une expression when ou une fonction d’assistance.
Les développeurs débutants essaient parfois d’utiliser l’Elvis Operator pour vérifier des valeurs booléennes : val x = flag ?: false. Cela ne fonctionne que si flag peut être null. Pour des conditions booléennes sans null, un if-else normal ou un opérateur ternaire est nécessaire — Kotlin n’a pas d’opérateur ternaire, mais il est remplacé par l’expression if-else : val x = if (flag) a else b.
Questions fréquemment posées
Elvis Operator ne vérifie que null, tandis que l’opérateur ternaire accepte n’importe quelle condition booléenne. Kotlin n’a pas d’opérateur ternaire — il est remplacé par l’expression if-else. Elvis résoudre une tâche spécifique : une valeur par défaut quand il y a null, alors que l’opérateur ternaire couvre toutes les expressions conditionnelles.
Oui, la partie droite peut être un appel de fonction : val x = a ?: calculateDefault(). La fonction n’est évaluée que lorsque a est null grâce à l’évaluation paresseuse. Cela permet d’utiliser des calculs coûteux, des appels API ou des requêtes base de données sans perte de performance quand une valeur est présente.
Java n’a pas d’Elvis Operator direct. À partir de Java 8, on peut utiliser Optional.ofNullable(value).orElse(default). Java 14+ a introduit les expressions switch, mais un ?: complet est absent. Kotlin et Groovy le fournissent comme construction syntaxique intégrée du langage.
Le modèle typique est un appel sécurisé ?. suivi d’Elvis. Exemple : user?.address?.city ?: « Unknown ». Si un élément de la chaîne est null — la valeur par défaut est renvoyée. C’est un remplacement compact des vérifications if imbriquées, réduisant le code de 3 à 5 fois par rapport à l’approche traditionnelle.
Elvis Operator est une construction syntaxique au niveau du langage, tandis qu’orElse est une méthode de Optional en Java. Elvis est paresseux (la partie droite n’est évaluée qu’en cas de null), tandis qu’orElse évalue toujours son argument. Pour une variante paresseuse en Java, il existe orElseGet qui accepte un Supplier. Elvis est plus court et ne nécessite pas la création d’un Optional.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi