Historique de la question : Kotlin prend en charge depuis le début le mécanisme de « destructuration », permettant d'extraire facilement des valeurs d'objets, de collections, et des données de retour de fonctions. Ce mécanisme a été inspiré par des langages comme Scala et JavaScript (destructuration ES6).
Problématique : Dans les langages de programmation orientée objet classiques, pour extraire plusieurs propriétés d'un objet, il fallait soit accéder explicitement à chaque champ, soit recourir à des structures intermédiaires, ce qui créait de la verbosité. Cela s'avère particulièrement inconfortable dans les boucles, le traitement des paires à partir de Map ou lors du travail avec des data class.
Solution : Les déclarations de destructuration permettent de déclarer plusieurs variables et de leur assigner des valeurs d'un objet en une seule ligne, grâce à l'implémentation des fonctions de composant (componentN) dans les classes.
Exemple de code :
data class Person(val name: String, val age: Int) val (n, a) = Person("Alex", 25) println("Nom: $n, Âge: $a") // Nom: Alex, Âge: 25 val map = mapOf(1 to "a", 2 to "b") for ((key, value) in map) println("$key = $value")
Caractéristiques clés :
Peut-on destructurer n'importe quelle classe ?
Non. Les méthodes componentN sont nécessaires. Les data class et les paires/triples standards les contiennent déjà. Pour les classes ordinaires, elles peuvent être ajoutées manuellement.
Exemple :
class Point(val x: Int, val y: Int) { operator fun component1() = x operator fun component2() = y } val (cx, cy) = Point(5, 10)
Que se passe-t-il si l'on essaie de destructurer un objet avec un nombre inférieur de componentN ?
Le compilateur génère une erreur si l'on essaie de déclarer plus de variables que ce qui est implémenté par componentN :
data class OnlyX(val x: Int) val (x, y) = OnlyX(5) // Erreur ! Pas de component2()
Est-il possible de destructurer la valeur de retour d'une fonction ?
Oui ! Une fonction peut renvoyer une paire (Pair), une triple (Triple) ou une data class — la destructuration prend en charge cela :
fun coords() = Pair(1, 2) val (x, y) = coords()
On passe à une fonction une data class avec cinq champs ; la destructuration est utilisée avec cinq variables. Après un certain temps, un champ a été ajouté — le motif nécessite la révision de toute la logique d'analyse, laissant apparaître des variables inutilisées.
Avantages :
Inconvénients :
La destructuration est utilisée uniquement pour des data class avec 2–3 champs (par exemple, x, y coordonnées), ou lors de l'itération sur une map, où la structure est garantiellement fixe.
Avantages :
Inconvénients :