0Pricing
Kotlin Academy · Lezione

Copiare con copy() e override parziali

Utilizzi copy() per creare istanze modificate senza alterare l'originale.

Copiare con copy() e override parziali è una lezione Kotlin Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Kotlin Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Kotlin Academy include 4 lezioni in totale.

Aggiornamenti immutabili con copy()

copy() crea una nuova istanza di una data class con alcune proprietà modificate. Tutte le proprietà non specificate mantengono i valori originali.

copy() di base

Passi argomenti denominati per sovrascrivere proprietà specifiche.
data class Person(val name: String, val age: Int, val city: String)
val alice = Person("Alice", 30, "Berlin")
val olderAlice = alice.copy(age = 31)
println(olderAlice)  // Person(name=Alice, age=31, city=Berlin)

Copiare più campi

Sovrascriva tutti i campi necessari.
data class Config(val host: String, val port: Int, val ssl: Boolean, val timeout: Int)
val prod = Config("prod.server", 443, true, 30)
val test = prod.copy(host = "test.server", port = 8080, ssl = false)
println(test)

copy non modifica l'originale

copy crea sempre un nuovo oggetto. L'originale rimane completamente invariato.
data class Point(val x: Int, val y: Int)
val origin = Point(0, 0)
val moved = origin.copy(x = 5)
println(origin)  // Point(x=0, y=0) — unchanged
println(moved)   // Point(x=5, y=0)

Attenzione alla copia profonda

copy è una copia superficiale. Gli oggetti mutabili all'interno di una data class sono condivisi tra l'originale e la copia.
data class Team(val name: String, val members: MutableList<String>)
val t1 = Team("A", mutableListOf("Alice"))
val t2 = t1.copy(name = "B")
t2.members.add("Bob")       // modifies SHARED list!
println(t1.members)  // [Alice, Bob] ← also changed!

Evitare i problemi delle copie superficiali

Usi dati immutabili all'interno delle data class per evitare problemi di condivisione.
data class Team(val name: String, val members: List<String>)  // immutable list
val t1 = Team("A", listOf("Alice"))
val t2 = t1.copy(name = "B", members = t1.members + "Bob")
println(t1.members)  // [Alice]
println(t2.members)  // [Alice, Bob]

copy nella gestione dello stato

copy è il modo idiomatico per aggiornare lo stato nelle architetture in stile Redux o MVI.
data class UiState(val loading: Boolean, val items: List<String>, val error: String?)
fun reduce(state: UiState, action: Action) = when (action) {
    is Loading -> state.copy(loading = true)
    is Success -> state.copy(loading = false, items = action.data)
    is Error -> state.copy(loading = false, error = action.msg)
}

copy con parametri predefiniti

Le data class con molte proprietà offrono comunque un copy pratico grazie agli argomenti denominati.
data class Article(
    val id: Long, val title: String, val body: String,
    val published: Boolean = false, val views: Int = 0
)
val draft = Article(1L, "Hello", "Content...")
val published = draft.copy(published = true)
println(published.title)  // Hello

Usare copy nei test

copy semplifica la creazione dei fixture di test: crei un oggetto di base e vari solo i campi necessari.
val baseUser = User(id = 1, name = "Test", email = "test@test.com", active = true)
val inactiveUser = baseUser.copy(active = false)
val renamed = baseUser.copy(name = "Renamed")

copy vs pattern Builder

La funzione copy() delle data class è l'equivalente Kotlin del pattern Builder. Per oggetti complessi con molti campi opzionali, data class + copy è più conciso.
// Java Builder:
User.builder().name("A").age(30).role("admin").build()
// Kotlin:
val u = User("A", 30, "admin")  // or copy from base

Semantica dei record

Le data class con proprietà val si comportano come i record Java (JDK 16+): immutabili, basate sul valore e stampabili automaticamente.
data class RGB(val r: Int, val g: Int, val b: Int)
val white = RGB(255, 255, 255)
println(white)  // RGB(r=255, g=255, b=255)

Verifica rapida

Che cosa accade all'istanza originale della data class quando si chiama copy() su di essa?

Riepilogo

copy() crea una nuova istanza con i campi sovrascritti: l'originale rimane invariato. È ideale per la gestione dello stato, i test e la costruzione in stile builder. Faccia attenzione alle copie superficiali con proprietà mutabili. Prossimo argomento: destrutturazione!

Domande Frequenti

La lezione «Copiare con copy() e override parziali» è gratuita?

Sì — il testo completo di «Copiare con copy() e override parziali» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Kotlin Academy, passa a CoddyKit PRO. Il corso Kotlin Academy include 4 lezioni in totale.

Cosa imparerò in «Copiare con copy() e override parziali»?

Utilizzi copy() per creare istanze modificate senza alterare l'originale. Eserciti Kotlin Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Kotlin Academy?

Non è richiesta alcuna esperienza precedente. Kotlin Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Copiare con copy() e override parziali»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Kotlin Academy?

Sì. Ogni lezione Kotlin Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Basi delle data class: metodi generati automaticamente
  2. Copiare con copy() e override parziali
  3. Dichiarazioni destrutturate con componentN
  4. Data class nelle collezioni e come chiavi di map
← Torna a Kotlin Academy