data class in Kotlin è un tipo speciale di classe progettata esclusivamente per memorizzare dati. Il compilatore genera automaticamente i metodi equals, hashCode, toString, copy e componentN basandosi sulle proprietà specificate nel costruttore primario. Secondo la documentazione JetBrains (2026), data class consente di ridurre il codice boilerplate del 50–70% rispetto agli equivalenti Java ed è la base per gli oggetti valore nei progetti Kotlin.
Punti chiave
data class è una costruzione sintattica di Kotlin che genera automaticamente metodi standard per classi il cui scopo principale è memorizzare dati. Quando si dichiara un data class, il compilatore crea implementazioni di equals, hashCode, toString, copy e componentN basandosi su tutte le proprietà del costruttore primario.
A differenza delle classi regolari in Java, dove lo sviluppatore deve scrivere manualmente getter, setter, equals, hashCode e toString usando IDE o librerie come Lombok, Kotlin fornisce un meccanismo incorporato. Questo non solo riduce il codice ma garantisce anche coerenza — i metodi automatici corrispondono sempre all'attuale struttura delle proprietà.
Secondo il JetBrains Kotlin Survey (2025), data class è utilizzato nel 78% dei progetti Kotlin, rendendolo una delle funzionalità più richieste del linguaggio. È particolarmente popolare in architetture con DTO, modelli di risposta API e oggetti di stato in MVVM.
data class si dichiara con la parola chiave data prima di class. Tutte le proprietà che partecipano ai metodi automatici sono specificate nel costruttore primario.
data class User(
val id: Int,
val name: String,
val email: String
)
Una riga di codice sostituisce decine di righe di boilerplate in Java. Il compilatore genera equals, hashCode, toString, copy e component1–component3 per tutte e tre le proprietà.
I metodi automatici includono solo le proprietà del costruttore primario. Se una proprietà viene dichiarata nel corpo della classe, non partecipa a equals, hashCode, toString e copy.
data class Product(
val id: Int,
val title: String
) {
var cachedPrice: Double = 0.0
// cachedPrice is NOT included in equals/hashCode/copy
}
Il costruttore primario di un data class deve contenere almeno un parametro. Tutti i parametri devono essere contrassegnati come val o var. Non è possibile utilizzare i modificatori open, abstract, sealed o inner per un data class.
equals e hashCode vengono generati basandosi sui valori di tutte le proprietà del costruttore primario. Due istanze di un data class sono considerate uguali se tutte le loro proprietà corrispondenti sono uguali.
In Java, il confronto di oggetti predefinito è il confronto di riferimenti (==). Il confronto per valore richiede la sovrascrittura di equals. Kotlin data class lo fa automaticamente, consentendo l'uso di == per il confronto strutturale.
data class Address(
val city: String,
val street: String
)
val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2) // true
Il metodo toString restituisce una rappresentazione leggibile dell'oggetto con nomi e valori di tutte le proprietà. Ciò semplifica significativamente la registrazione e il debug rispetto a Java, dove l'output predefinito mostra il codice hash in formato esadecimale.
Secondo la Documentazione di Kotlin (2026), toString di un data class ha il formato: “User(id=1, name=John, email=john@example.com)”. Quando si rimuovono proprietà dal costruttore primario, toString viene aggiornato automaticamente — il rischio di desincronizzazione è eliminato.
copy è una delle caratteristiche principali di data class. Crea una copia superficiale dell'oggetto con la possibilità di modificare i valori delle proprietà specificate.
data class Order(
val id: Long,
val status: String,
val amount: Double
)
val order = Order(1L, "Pending", 299.99)
val updatedOrder = order.copy(status = "Confirmed")
// updatedOrder.id = 1L, amount = 299.99, status = "Confirmed"
copy è indispensabile nello stile funzionale e nelle architetture con immutabilità. Invece di mutare un oggetto esistente, viene creata una nuova copia con campi modificati, rendendo il codice più prevedibile e sicuro in scenari multithread.
data class genera automaticamente le funzioni component1, component2 e così via per ogni proprietà nell'ordine di dichiarazione. Ciò consente di destrutturare l'oggetto in variabili.
val user = User(1, "Alice", "alice@example.com")
val (id, name, email) = user
println("$id: $name ($email)") // "1: Alice (alice@example.com)"
La destrutturazione funziona anche in lambda e cicli for-each, rendendo data class conveniente per lavorare con le collezioni.
Prima limitazione — data class non supporta l'ereditarietà da un altro data class. Si può ereditare solo da classi regolari o interfacce.
Seconda — i metodi automatici includono solo le proprietà del costruttore primario. Le proprietà nel corpo della classe vengono ignorate, il che può portare a un equals errato se ci si dimentica di questo.
Terza — data class non può essere open, abstract, sealed o inner. È sempre final.
Quarta — per le collezioni all'interno di un data class, copy esegue una copia superficiale. Modificare gli elementi all'interno della collezione copiata influenzerà l'originale.
Secondo le Migliori Pratiche di Kotlin (2026), data class è ottimale per DTO, modelli API, oggetti valore e oggetti di stato. Per componenti con logica di business, si consiglia di utilizzare classi regolari.
Domande Frequenti
No, un data class non può ereditare un altro data class. Tuttavia, può ereditare una classe regolare o implementare interfacce.
Almeno una proprietà. Il numero massimo non è limitato, ma componentN viene generato per la destrutturazione.
No, i metodi automatici considerano solo le proprietà del costruttore primario. Le proprietà dal corpo della classe non partecipano a equals, hashCode, toString e copy.
Sì, tu puoi sovrascrivere equals, hashCode o toString nel corpo del data class. In questo caso, il compilatore non genera una propria implementazione.
Un data class genera automaticamente equals, hashCode, toString, copy e componentN. Una classe regolare non fornisce questi metodi senza implementazione manuale.
Riepilogo
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.
Leggi anche