Destructuring declaration — cos'è, sintassi e utilizzo in Kotlin

Autore: IT Sectr Pubblicato: 2026-06-23 Tempo di lettura: 7 min

Destructuring declaration è una funzionalità di Kotlin che consente di scomporre un oggetto in più variabili in una singola espressione. La costruzione val (name, age) = user dichiara simultaneamente due variabili, assegnando loro valori dai componenti dell'oggetto. Secondo la documentazione Kotlin (2026), la destrutturazione riduce il volume di codice quando si lavora con data class del 30–50%. Destructuring declaration rende il codice più conciso e leggibile.

Punti chiave

  • Destructuring declaration — sintassi val (a, b) = obj per scomporre un oggetto in variabili
  • ComponentN() — funzioni component1(), component2(), component3() e così via, chiamate automaticamente
  • Data class genera automaticamente componentN() per tutte le proprietà dichiarate nel costruttore primario
  • Pair e Triple — classi standard con destrutturazione integrata per due e tre valori
  • Map.Entry — supporta la destrutturazione in key e value per un'iterazione comoda

Cos'è destructuring declaration?

Destructuring declaration (dichiarazione di destrutturazione) è una costruzione sintattica di Kotlin che consente di scomporre un'istanza di classe in più variabili in una singola espressione. Il lato sinistro contiene un elenco di variabili tra parentesi, il lato destro contiene l'oggetto da scomporre. Kotlin chiama automaticamente la funzione componentN() corrispondente per ogni variabile, dove N è il numero ordinale della variabile tra parentesi.

La dichiarazione di destrutturazione è più comunemente utilizzata con le data class. Il compilatore Kotlin genera automaticamente component1(), component2() e così via per ogni data class — in base al numero di proprietà nel costruttore primario. Per le classi regolari senza il modificatore data, componentN() non vengono generati, ma possono essere definiti manualmente come funzioni operatore con la parola chiave operator.

La dichiarazione di destrutturazione è diventata un pattern popolare grazie alla sua capacità di semplificare il codice quando si lavora con collezioni di coppie, risultati di funzioni e iterazione di Map. Invece di scrivere person.firstName, person.lastName, lo sviluppatore scrive val (firstName, lastName) = person. Ciò riduce il numero di righe e migliora la leggibilità, specialmente in cicli e lambda.

Come funziona la destrutturazione in Kotlin?

Quando incontra la costruzione val (a, b) = obj, il compilatore Kotlin genera il seguente codice: val a = obj.component1(); val b = obj.component2(). Se le variabili sono dichiarate con var, vengono generate assegnazioni var. Il tipo di ogni variabile viene dedotto dal tipo di ritorno della corrispondente funzione componentN(). Ciò significa che la dichiarazione di destrutturazione è completamente type-safe e verificata in fase di compilazione.

kotlin
data class Person(val firstName: String, val lastName: String, val age: Int)

fun main() {
    val person = Person("Alice", "Smith", 30)

    // Destrutturazione: component1(), component2(), component3()
    val (firstName, lastName, age) = person
    println("$firstName $lastName, $age anni")
}

Nel listato, Person è una data class con tre proprietà. Kotlin genera component1() → firstName, component2() → lastName, component3() → age. L'espressione val (firstName, lastName, age) = person chiama queste funzioni e assegna i risultati. Importante: i nomi delle variabili non devono corrispondere ai nomi delle proprietà — il compilatore osserva solo l'ordine di componentN() e i loro tipi. È possibile scomporre solo le prime N proprietà, ignorando il resto.

Destrutturazione di data classes e tipi standard

Le data class sono i candidati principali per la dichiarazione di destrutturazione. Ogni data class ottiene automaticamente componentN() per tutte le proprietà del costruttore primario. L'ordine di componentN() corrisponde all'ordine di dichiarazione delle proprietà. Ciò significa che quando si modifica l'ordine dei campi in una data class, anche l'ordine delle variabili nella destrutturazione cambia — il che può portare a bug sottili.

kotlin
// Destrutturazione di Pair
val pair = Pair("key", 42)
val (key, value) = pair
println("$key -> $value")

// Destrutturazione di Triple
val triple = Triple("A", "B", "C")
val (first, second, third) = triple

// Map.Entry nel ciclo
val map = mapOf("a" to 1, "b" to 2)
for ((k, v) in map) {
    println("$k = $v")
}

Pair e Triple sono classi standard con destrutturazione integrata per due e tre componenti. Pair viene spesso utilizzato come tipo di ritorno per funzioni che devono restituire due valori correlati senza creare una data class separata. In un ciclo for su Map.Entry, la costruzione (k, v) = entry destruttura la chiave e il valore tramite component1() e component2(). Questo è il pattern standard per iterare su una Map in Kotlin, sostituendo completamente le chiamate esplicite a key e value.

Trattino basso per variabili inutilizzate

Se alcuni componenti non sono necessari durante la destrutturazione, Kotlin consente di sostituirli con un trattino basso _. Ciò migliora la leggibilità — il lettore vede immediatamente che il componente viene ignorato. Inoltre, l'uso di _ impedisce l'accesso accidentale a una variabile non inizializzata: il compilatore non crea alcuna variabile per _, eliminando gli avvisi sulle variabili inutilizzate.

kotlin
data class Order(
    val id: Long,
    val customerName: String,
    val amount: Double,
    val status: String
)

fun process(orders: List<Order>) {
    for ((id, _, amount) in orders) {
        println("Ordine $id: $amount")
    }
}

Nel listato, Order ha quattro proprietà, ma il ciclo necessita solo di id e amount. Il trattino basso al posto di customerName dice al compilatore “salta component2()”. Kotlin non chiama component2() e non crea una variabile per questo componente. Importante: i trattini bassi possono essere utilizzati solo nelle dichiarazioni di destrutturazione, non nel costruttore della data class. Se vengono saltati più componenti consecutivi, ciascuno riceve il proprio trattino basso.

Creazione di componentN() per classi personalizzate

Per le classi senza il modificatore data, è possibile definire manualmente componentN() aggiungendo la parola chiave operator. Ciò consente di utilizzare la dichiarazione di destrutturazione con qualsiasi classe, incluse classi di terze parti il cui codice sorgente non può essere modificato — basta scrivere una funzione di estensione con operator. Questo approccio è particolarmente utile per classi di librerie e classi Java che non hanno componentN() automatici.

kotlin
class Rect(val width: Int, val height: Int)

operator fun Rect.component1(): Int = width
operator fun Rect.component2(): Int = height

// Per classe Java con getters
operator fun Dimension.component1(): Int = width
operator fun Dimension.component2(): Int = height

fun main() {
    val rect = Rect(1920, 1080)
    val (w, h) = rect
    println("Risoluzione: ${w}x${h}")
}

Nell'esempio, Rect è una classe regolare senza data. Le funzioni di estensione con operator fun component1() = width e component2() = height aggiungono il supporto alla destrutturazione. Analogamente per java.awt.Dimension: un'estensione operator su Dimension consente di scomporlo in width e height. Limitazione: il numero massimo di componenti per una dichiarazione di destrutturazione è 5. In teoria è possibile definire component6() e superiori, ma Kotlin non genererà la sintassi corrispondente per 6+ variabili tra parentesi.

Domande frequenti

Ogni data class supporta la destrutturazione?

Sì, ogni data class ottiene automaticamente componentN() per tutte le proprietà del costruttore primario. Le proprietà dichiarate nel corpo della classe (tramite parametri del costruttore senza val/var) non generano componentN().

Cosa succede se il numero di variabili non corrisponde?

Se val (a, b, c) = obj ha un oggetto con solo due funzioni component, il compilatore genererà un errore. Se ci sono meno variabili (val (a) = pair), Kotlin chiamerà solo component1() e ignorerà component2() — non si verificherà alcun errore.

Si può destrutturare una Map senza ciclo?

Sì, Map.Entry supporta la destrutturazione: val (key, value) = map.entries.first(). La destrutturazione non funziona sull'intera Map in una volta — solo elemento per elemento, in un ciclo for o tramite un iteratore.

La destrutturazione funziona nelle lambda?

Sì, Kotlin supporta la destrutturazione nei parametri lambda: map.forEach { (k, v) -> ... }. Per le data class nei parametri lambda, è necessario aggiungere parentesi annidate attorno al parametro.

Qual è la dimensione massima della destrutturazione?

Kotlin supporta fino a 5 variabili in una dichiarazione di destrutturazione. Se è necessario scomporre più di cinque proprietà, combinarle in data class annidate o utilizzare Pair/Triple all'interno di una singola variabile.

Riepilogo

  • Destructuring declaration — sintassi val (a, b) = obj, scompone un oggetto in più variabili in una singola espressione
  • ComponentN() — funzioni component1(), component2(), ... chiamate automaticamente dal compilatore durante la destrutturazione
  • Data class genera automaticamente componentN() per tutte le proprietà del costruttore primario
  • Pair e Triple — classi standard con destrutturazione integrata per 2 e 3 componenti
  • Trattino basso _ sostituisce i componenti inutilizzati senza creare una variabile
  • Operator componentN() nelle funzioni di estensione aggiunge la destrutturazione a qualsiasi classe, inclusa Java
  • Map.Entry in un ciclo for ((k, v) in map) — pattern idiomatico standard di Kotlin per iterare su un dizionario

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche