La structure when en Kotlin est un outil puissant pour contrôler le flux d'exécution d'un programme, remplaçant le traditionnel switch-case de Java. when a été introduit pour accroître l'expressivité, réduire le code boilerplate et améliorer la sécurité des types.
En Java, la structure switch-case est limitée à certains types (enum, int, String). Contrairement à Java, les développeurs de Kotlin ont cherché à simplifier les branches conditionnelles, les rendant plus expressives et sûres.
Les limitations du switch-case en Java rendent difficile l'extension et la maintenance du code, surtout lors du travail avec des collections, la comparaison de plages ou le traitement de différents types.
La structure when en Kotlin est universelle : elle fonctionne comme une expression (peut retourner une valeur), prend en charge les vérifications conditionnelles, les plages, les valeurs individuelles, les types et la combinaison des conditions.
fun describe(obj: Any): String = when (obj) { 1 -> "Un" in 2..10 -> "De deux à dix" is String -> "Chaîne de longueur ${obj.length}" else -> "Inconnu" } val res1 = describe(1) // "Un" val res2 = describe(5) // "De deux à dix" val res3 = describe("Kotlin") // "Chaîne de longueur 6" val res4 = describe(42.0) // "Inconnu"
Le when peut-il être utilisé sans argument ?
Oui, when peut être utilisé comme remplacement d'une longue chaîne d'if-else, si aucune vérification de valeur d'une variable spécifique n'est nécessaire.
when { x < 0 -> println("Négatif") x == 0 -> println("Zéro") else -> println("Positif") }
Le bloc else est-il obligatoire dans la structure when ?
Le bloc else n'est pas obligatoire si tous les cas possibles sont traités, par exemple, pour les enum ou les classes seal. Mais s'il y a un risque de cas non couvert, else est obligatoire pour éviter les erreurs de compilation.
sealed class Fruit object Apple : Fruit() object Pear : Fruit() fun check(f: Fruit): String = when (f) { Apple -> "C'est une pomme" Pear -> "C'est une poire" // Pas de bloc else, et le compilateur ne se plaint pas — tous les cas sont couverts }
Peut-on utiliser plusieurs valeurs dans une seule branche when ?
Oui, plusieurs valeurs peuvent être combinées par des virgules.
when (value) { 0, 1 -> println("Zéro ou Un") else -> println("Autre") }
Dans un système de paiement, switch-case est utilisé pour déterminer le statut d'une opération. Lors de l'ajout d'un nouveau type de statut, l'actualisation du switch a été oubliée. Un statut non traité entraîne une erreur silencieuse.
Avantages :
Inconvénients :
En Kotlin, une classe seal est utilisée pour les statuts et la structure when pour leur traitement. Lors de l'ajout d'un nouveau statut, le compilateur exige d'ajouter le traitement du nouveau cas.
Avantages :
Inconvénients :