Kotlin Academy · Lezione

Getter e setter personalizzati con field

Scriva proprietà calcolate e setter personalizzati usando la parola chiave del campo di supporto.

Lezione 3 di 413 passaggi

Getter e setter personalizzati con field è una lezione Kotlin Academy gratuita su CoddyKit. Questa è la lezione 3 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.

Le proprietà non sono solo campi

Ogni proprietà Kotlin dispone di un getter generato automaticamente e, per var, di un setter. È possibile sovrascriverli per aggiungere logica, ad esempio convalida, logging o calcoli.

Getter personalizzato

Sovrascriva get() per calcolare il valore ogni volta che viene letto.

class Circle(val radius: Double) {
    val area: Double
        get() = Math.PI * radius * radius
}
fun main() {
    val c = Circle(3.0)
    println(c.area) // ~28.27
}

Proprietà calcolate

Le proprietà calcolate non hanno un backing field: il loro valore viene calcolato a ogni accesso.

class Rectangle(val w: Int, val h: Int) {
    val area get() = w * h
    val perimeter get() = 2 * (w + h)
}
fun main() {
    val r = Rectangle(3, 4)
    println("${r.area}, ${r.perimeter}") // 12, 14
}

Setter personalizzato con field

All'interno di un setter personalizzato, field fa riferimento al backing field, cioè alla memoria di archiviazione effettiva.

class Temperature {
    var celsius: Double = 0.0
        set(value) {
            require(value >= -273.15) { "below absolute zero" }
            field = value
        }
}
fun main() {
    val t = Temperature()
    t.celsius = 25.0
    println(t.celsius)
    // t.celsius = -300.0 // throws
}

Backing field generato automaticamente

Se il getter o il setter utilizza field, Kotlin genera un backing field. Se nessuno dei due lo utilizza, non viene creato alcun campo: la proprietà è puramente calcolata.

class Counter {
    var count: Int = 0
        set(value) {
            println("Setting count from $field to $value")
            field = value
        }
}
fun main() {
    val c = Counter()
    c.count = 5
    c.count = 10
}

Setter con effetti collaterali

Utilizzi setter personalizzati per il logging, le notifiche delle modifiche o la sincronizzazione dello stato correlato.

class Brightness {
    var level: Int = 50
        set(value) {
            val clamped = value.coerceIn(0, 100)
            println("Brightness -> $clamped")
            field = clamped
        }
}
fun main() {
    val b = Brightness()
    b.level = 75
    b.level = 150 // clamps to 100
    println(b.level)
}

Setter privato

Contrassegni il setter come private per esporre un'API di sola lettura consentendo al contempo le modifiche interne.

class Score {
    var value: Int = 0
        private set
    fun increment() { value++ }
    fun reset() { value = 0 }
}
fun main() {
    val s = Score()
    s.increment(); s.increment()
    println(s.value) // 2
    // s.value = 100 // ERROR: setter is private
}

Convalida nel setter

I setter personalizzati sono il luogo naturale per la convalida degli input.

class Email {
    var address: String = ""
        set(value) {
            require(value.contains("@")) { "invalid email" }
            field = value
        }
}
fun main() {
    val e = Email()
    e.address = "ada@example.com"
    println(e.address)
}

Getter con logica

I getter possono trasformare lo stato memorizzato, ad esempio formattando un valore memorizzato o applicando un valore alternativo predefinito.

class Profile(_name: String?) {
    var rawName: String? = _name
    val displayName: String
        get() = rawName ?: "(unset)"
}
fun main() {
    val p = Profile(null)
    println(p.displayName) // (unset)
}

Confronto tra val e var

Le proprietà val dispongono solo di un getter, non di un setter; le proprietà var dispongono di entrambi.

class Box {
    val readOnly: Int get() = 42
    var readWrite: Int = 0
}
fun main() {
    println(Box().readOnly)
    val b = Box(); b.readWrite = 5; println(b.readWrite)
}

Errore comune: ricorsione

Non usi il nome della proprietà all'interno del suo accessor: causa una ricorsione infinita. Usi invece field.

class Wrong {
    var x: Int = 0
        set(value) {
            // x = value // INFINITE RECURSION — calls setter again
            field = value // CORRECT
        }
}
fun main() {
    val w = Wrong(); w.x = 42; println(w.x)
}

Verifica rapida

All'interno di un setter personalizzato, a cosa si riferisce l'identificatore field?

Riepilogo

Sovrascriva get() e set() per aggiungere logica all'accesso alle proprietà. Usi field all'interno degli accessor per leggere e scrivere il campo di supporto. Contrassegni i setter come private per ottenere API pubbliche di sola lettura; usi proprietà calcolate (senza campo di supporto) quando il valore è sempre derivato.

Gratis per iniziare

Impara Kotlin con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
51
Lezioni
203

Domande Frequenti

La lezione «Getter e setter personalizzati con field» è gratuita?

Sì — il testo completo di «Getter e setter personalizzati con field» è 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 «Getter e setter personalizzati con field»?

Scriva proprietà calcolate e setter personalizzati usando la parola chiave del campo di supporto. 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 3 di 4.

Quanto tempo richiede la lezione «Getter e setter personalizzati con field»?

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. Costruttore primario e parametri delle proprietà
  2. Blocchi init e ordine di inizializzazione
  3. Getter e setter personalizzati con field
  4. lateinit e inizializzazione lazy
← Torna a Kotlin Academy