Introduction : Adieu switch-case ? Bonjour when !
Si vous venez à Kotlin depuis Java, C# ou JavaScript, la première chose que vous cherchez probablement est l'opérateur familier switch-case. Et là, surprise : dans Kotlin, il n'y a pas de switch-case classique. À la place, le langage propose un outil bien plus puissant et flexible : when.
Sur Stack Overflow, la question "How to implement switch-case statement in Kotlin" cumule des milliers de vues. C'est normal : les développeurs s'habituent à certaines constructions et veulent trouver leurs équivalents. Mais la vérité est que when en Kotlin n'est pas simplement un remplacement de switch. C'est son évolution, qui fonctionne sous le capot de manière plus intelligente et plus rapide.
Dans cet article, nous ne montrerons pas seulement comment écrire when. Nous allons regarder sous le capot : découvrir en quoi votre code est compilé, pourquoi il est plus rapide que switch dans certains scénarios et comment utiliser when à 100 %.
1. Syntaxe de base : de switch-case à when
Pour commencer, l'exemple le plus simple. Imaginons que nous ayons une bonne vieille construction Java :
// Javaint day = 3;String dayName;switch (day) { case 1: dayName = "Lundi"; break; case 2: dayName = "Mardi"; break; case 3: dayName = "Mercredi"; break; default: dayName = "Jour inconnu";}En Kotlin, cela ressemblera à ceci :
// Kotlinval day = 3val dayName = when (day) { 1 -> "Lundi" 2 -> "Mardi" 3 -> "Mercredi" else -> "Jour inconnu"}On voit déjà deux avantages majeurs :
- Pas de break — Kotlin quitte automatiquement le bloc après l'exécution de la branche.
- Retourne une valeur — on peut assigner le résultat à une variable.
2. Comment fonctionne when sous le capot : bytecode et optimisation
Voici le plus intéressant. Lorsque vous écrivez when, le compilateur Kotlin analyse vos conditions et choisit la méthode d'exécution optimale. Regardons le bytecode (approximativement, sans détails superflus).
Cas 1 : when avec des constantes (comme switch-case)
Si vous utilisez when avec des entiers, des chaînes ou des constantes enum, le compilateur génère une table de saut (tableswitch ou lookupswitch). C'est le même mécanisme qu'utilise Java pour switch-case. La différence est que Kotlin le fait automatiquement, sans votre intervention.
Cas 2 : when avec des conditions quelconques
Si vous écrivez quelque chose comme :
when (x) { in 1..10 -> "Petit" in 11..100 -> "Moyen" else -> "Grand"}Le compilateur ne peut pas utiliser de table de saut. Il génère une chaîne de if-else. Mais Kotlin le fait de manière extrêmement efficace : les conditions sont vérifiées dans l'ordre, et dès qu'une correspondance est trouvée, l'exécution s'arrête.
Cas 3 : when sans argument
C'est une magie à part entière. Si vous écrivez :
when { x > 0 -> "Positif" x < 0 -> "Négatif" else -> "Zéro"}Le compilateur transforme cela en if-else classiques. Mais la syntaxe est bien plus propre que des if imbriqués.
Conclusion : Kotlin ne se contente pas de copier switch-case. Il choisit intelligemment entre une table de saut et des if-else pour que votre code fonctionne le plus rapidement possible.
3. Fonctionnalités avancées de when : ce que switch n'a pas
when sait faire bien plus que simplement comparer des valeurs. Voici quelques fonctionnalités killer :
3.1. Vérification de type (smart cast)
fun describe(obj: Any): String = when (obj) { is String -> "Chaîne de longueur ${obj.length}" // smart cast vers String is Int -> "Nombre entier" is List<*> -> "Liste de ${obj.size} éléments" else -> "Type inconnu"}