ProgrammationDéveloppeur Kotlin

Qu'est-ce que la structure when en Kotlin, comment fonctionne-t-elle, en quoi diffère-t-elle du switch-case en Java et quelles possibilités offre-t-elle pour le traitement de différentes situations ? Donnez des exemples de différents cas d'utilisation.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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.

Historique de la question

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.

Problème

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.

Solution

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.

Exemple de code :

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"

Caractéristiques clés :

  • Possibilité de travailler à la fois avec des expressions et des opérateurs.
  • Vérification par valeur, type, plage et conditions complexes.
  • Garantie de sécurité lors du traitement de tous les cas (par exemple, avec des classes seal).

Questions piégeuses.

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") }

Erreurs typiques et anti-patterns

  • Omettre le bloc else lors de variantes incomplètes (peut entraîner des erreurs d'exécution).
  • Surcharger when avec des branches trop complexes (violation de la lisibilité).
  • Utiliser when uniquement comme switch-case, sans appliquer les vérifications de type et de plage.

Exemple de la vie réelle

Cas négatif

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 :

  • Mise en œuvre rapide des modifications avec un petit nombre de statuts.

Inconvénients :

  • Pas de garantie que tous les statuts sont couverts.
  • Erreurs silencieuses implicites lors de l'apparition de nouvelles valeurs.

Cas positif

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 :

  • Traitement sécurisé de tous les statuts.
  • Erreur de compilation en cas d'omission d'un cas.

Inconvénients :

  • Nécessité d'une mise à jour soigneuse de la classe seal lors de l'extension du système.