data class in Kotlin — cos'è, sintassi e caratteristiche delle classi di dati

Autore: IT Sectr Pubblicato: 2026-06-20 Tempo di lettura: 10 min

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 — parola chiave per dichiarare una classe di dati in Kotlin
  • equals e hashCode — generati automaticamente basandosi su tutte le proprietà del costruttore primario
  • copy — funzione di copia superficiale con possibilità di sostituire singoli campi
  • componentN — destrutturazione di data class in variabili separate
  • Il costruttore primario deve contenere almeno un parametro val o var

Cos'è un data class in Kotlin?

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.

Sintassi e funzionalità di base

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.

kotlin
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à.

Proprietà fuori dal costruttore primario

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.

kotlin
data class Product(
    val id: Int,
    val title: String
) {
    var cachedPrice: Double = 0.0
    // cachedPrice is NOT included in equals/hashCode/copy
}

Limitazioni del costruttore primario

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.

Metodi automatici equals, hashCode e toString

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.

equals per il confronto di valore

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.

kotlin
data class Address(
    val city: String,
    val street: String
)

val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2)  // true

toString per il debug

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.

Funzione copy e destrutturazione

copy è una delle caratteristiche principali di data class. Crea una copia superficiale dell'oggetto con la possibilità di modificare i valori delle proprietà specificate.

kotlin
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.

Destrutturazione tramite componentN

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.

kotlin
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.

Limitazioni e raccomandazioni

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

Un data class può ereditare un altro data class?

No, un data class non può ereditare un altro data class. Tuttavia, può ereditare una classe regolare o implementare interfacce.

Quante proprietà devono essere nel costruttore primario?

Almeno una proprietà. Il numero massimo non è limitato, ma componentN viene generato per la destrutturazione.

Le proprietà dal corpo della classe influenzano equals?

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.

Posso sovrascrivere manualmente i metodi automatici?

Sì, tu puoi sovrascrivere equals, hashCode o toString nel corpo del data class. In questo caso, il compilatore non genera una propria implementazione.

In cosa differisce data class da una classe regolare?

Un data class genera automaticamente equals, hashCode, toString, copy e componentN. Una classe regolare non fornisce questi metodi senza implementazione manuale.

Riepilogo

  • data class — costruzione sintattica Kotlin per memorizzare dati con metodi auto-generati
  • equals e hashCode — confronto strutturale basato sulle proprietà del costruttore primario
  • toString — rappresentazione leggibile dell'oggetto per debug e registrazione
  • copy — copia superficiale con sostituzione di singoli campi tramite argomenti nominati
  • componentN — destrutturazione di oggetti in variabili per lavoro conveniente con le collezioni
  • Limitazioni — final per impostazione predefinita, almeno una proprietà, nessuna ereditarietà data->data
  • Utilizzo — DTO, modelli API, oggetti valore, stato in MVVM

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