Le dichiarazioni di destructuring permettono di "smontare" un oggetto in variabili direttamente nella dichiarazione, rendendo il codice più conciso. Storicamente, in Java e in altri linguaggi era necessario scrivere un getter separato per ogni componente, rendendo la sintassi ingombrante. Kotlin ha introdotto metodi speciali componentN() per supportare il destrutturamento.
Problema: È scomodo ottenere manualmente le parti di un oggetto composito — è necessario assegnare molto, il codice perde leggibilità.
Soluzione: la data class riceve automaticamente metodi componentN() durante la compilazione, che permettono di utilizzare le dichiarazioni di destructuring per ottenere i valori delle proprietà.
Esempio di codice:
data class User(val name: String, val age: Int) val user = User("Pavel", 32) val (name, age) = user println("$name ha $age anni") // Pavel ha 32 anni
Caratteristiche principali:
Quante variabili possono essere ottenute tramite dichiarazione di destructuring?
Tante quante sono definiti i metodi componentN() nella classe. Per le data class vengono creati automaticamente per tutte le proprietà del costruttore primario (fino a 255).
Funziona il destructuring con classi normali (non data)?
Solo se nella classe sono dichiarati manualmente i metodi componentN().
Esempio:
class Point(val x: Int, val y: Int) { operator fun component1() = x operator fun component2() = y } val (x, y) = Point(10, 20)
È possibile saltare valori nella dichiarazione di destructuring?
Sì, usa _ (underscore) per saltare variabili esterne.
val (_, onlyAge) = user
Caso negativo
In un progetto, uno sviluppatore ha cercato di utilizzare il destructuring per una classe normale senza metodi componentN(), il che portava a un errore di compilazione, dopodiché li aggiungeva manualmente per una classe molto grande (più di 10 proprietà).
Vantaggi:
Svantaggi:
Caso positivo
Uso della data class con un numero limitato di parametri (ad esempio, Result(val data: T, val error: Throwable?)), con una dichiarazione di destructuring concisa durante l'elaborazione della risposta nell'API.
Vantaggi:
Svantaggi: