Storia della domanda: Kotlin supporta fin dall'inizio il meccanismo di "destrutturazione", che consente di estrarre comodamente valori da oggetti, collezioni e dati restituiti da funzioni. Questo meccanismo è stato ispirato da linguaggi come Scala e JavaScript (destrutturazione ES6).
Problema: Nei linguaggi OOP classici, per estrarre più proprietà di un oggetto bisognava sempre riferirsi esplicitamente a ciascun campo o ricorrere a strutture intermedie, il che creava verbosità. Questo è particolarmente scomodo nei cicli, durante l'elaborazione delle coppie da Map o nel lavoro con classi dati.
Soluzione: Le dichiarazioni di destrutturazione consentono di dichiarare più variabili e assegnare loro valori da un oggetto in una sola riga, grazie all'implementazione delle funzioni componente (componentN) nelle classi.
Esempio di codice:
data class Person(val name: String, val age: Int) val (n, a) = Person("Alex", 25) println("Name: $n, Age: $a") // Name: Alex, Age: 25 val map = mapOf(1 to "a", 2 to "b") for ((key, value) in map) println("$key = $value")
Caratteristiche chiave:
Si può destrutturare qualsiasi classe?
No. Sono necessari metodi componentN. Le classi dati e le coppie/triplette standard li contengono già. Per le classi normali, possono essere aggiunti manualmente.
Esempio:
class Point(val x: Int, val y: Int) { operator fun component1() = x operator fun component2() = y } val (cx, cy) = Point(5, 10)
Cosa succede se si cerca di destrutturare un oggetto con un numero minore di componentN?
Il compilatore solleva un errore se si cerca di dichiarare più variabili delle componentN implementate:
data class OnlyX(val x: Int) val (x, y) = OnlyX(5) // Errore! Nessun component2()
È possibile destrutturare un valore restituito da una funzione?
Sì! Una funzione può restituire una coppia (Pair), una tripletta (Triple) o una classe dati — la destrutturazione supporta questo:
fun coords() = Pair(1, 2) val (x, y) = coords()
Una funzione riceve una classe dati con cinque campi; la destrutturazione viene utilizzata con cinque variabili. Dopo un po' è stato aggiunto un campo - il pattern richiede di rivedere tutta la logica di analisi, spesso compaiono variabili inutilizzate.
Pro:
Contro:
La destrutturazione è utilizzata solo per classi dati con 2-3 campi (ad esempio, coordinate x, y), oppure durante l'iterazione di una mappa, dove la struttura è garantita fissa.
Pro:
Contro: