Les déclarations de destructuration permettent de « décomposer » un objet en variables directement dans la déclaration, ce qui rend le code concis. Historiquement, en Java et dans d'autres langages, il était nécessaire d'écrire un getter séparé pour chaque composant, ce qui alourdissait la syntaxe. Kotlin a introduit des méthodes spéciales componentN() pour supporter la décomposition (destructuring).
Problème : Il est peu pratique d'obtenir manuellement des parties d'un objet composite - il faut faire beaucoup de petits assignements, rendant le code moins lisible.
Solution : une data class obtient automatiquement des méthodes componentN() lors de la compilation, permettant d'utiliser des déclarations de destructuration pour accéder aux valeurs des propriétés.
Exemple de code :
data class User(val name: String, val age: Int) val user = User("Pavel", 32) val (name, age) = user println("$name a $age ans") // Pavel a 32 ans
Caractéristiques clés :
Combien de variables peut-on obtenir via une déclaration de destructuration ?
Autant que de méthodes componentN() définies dans la classe. Pour une data class, celles-ci sont automatiquement créées pour toutes les propriétés du constructeur primaire (jusqu'à 255).
La destructuration fonctionne-t-elle avec des classes ordinaires (non data) ?
Uniquement si des méthodes componentN() sont déclarées manuellement dans la classe.
Exemple :
class Point(val x: Int, val y: Int) { operator fun component1() = x operator fun component2() = y } val (x, y) = Point(10, 20)
Peut-on ignorer des valeurs dans une déclaration de destructuration ?
Oui, utilisez _ (trait de soulignement) pour ignorer des variables externes.
val (_, onlyAge) = user
Cas négatif
Dans un projet, un développeur a essayé d'utiliser la destructuration pour une classe ordinaire sans méthodes componentN(), ce qui a conduit à une erreur de compilation, puis y a ajouté manuellement pour une classe très grande (10+ propriétés).
Avantages :
Inconvénients :
Cas positif
Utilisation d'une data class avec un nombre limité de paramètres (par exemple, Result(val data: T, val error: Throwable ?)), avec une déclaration de destructuration concise lors du traitement de la réponse dans l'API.
Avantages :
Inconvénients :