Destructuring declarations (déstructuration) en Kotlin permettent de "décomposer" des objets en parties constitutives directement dans la déclaration de variables, ce qui rend le code plus lisible et concis.
Par défaut la déstructuration fonctionne avec les data class et est prise en charge pour certaines collections (via les fonctions componentN()). Elle repose sur l'utilisation des fonctions componentN() dans l'objet de la classe.
Exemple avec data class :
data class User(val name: String, val age: Int) val user = User("Oleg", 32) val (name, age) = user println(name) // "Oleg" println(age) // 32
Exemple pour une classe personnalisée :
class Point(val x: Int, val y: Int) { operator fun component1() = x operator fun component2() = y } val point = Point(1, 2) val (a, b) = point
Particularités et subtilités :
Question : "Peut-on utiliser la déstructuration pour une classe qui n'est pas une data class, et quelles sont les conditions nécessaires ?"
Réponse : Oui, c'est possible. Il faut déclarer explicitement des fonctions opérateur componentN() dans la classe. Les data class les génèrent automatiquement, mais toute classe peut fournir ces fonctions afin d'autoriser la déstructuration.
Exemple :
class Pair<A, B>(val first: A, val second: B) { operator fun component1() = first operator fun component2() = second } val p = Pair(1, "q") val (a, b) = p
Cas
Dans un projet, la déstructuration était utilisée avec une Map et on a supposé à tort que la déstructuration était disponible pour toutes les collections itérables. Cela a généré des erreurs "ComponentN is missing" pour des List où un seul composant était attendu, provoquant des plantages de l'application.
Cas
Dans un module, la déstructuration était appliquée à des classes personnalisées ; après un refactoring, on a oublié d'ajouter les fonctions opérateur componentN, si bien que le code compilait mais échouait à l'exécution avec un NoSuchMethodError, interrompant le service en production.
Cas
Une data class a été modifiée — les attributs ont été réordonnés — mais les anciennes déclarations de déstructuration ont été laissées inchangées. Résultat : les valeurs ont été affectées aux mauvaises variables, entraînant une erreur grave de logique métier en production.