Sobes.tech
Middle

Cosa sono 'lazy' e 'lateinit' in Kotlin?

sobes.tech AI

Risposta dell'AI

lazy - delegato di proprietà per l'inizializzazione pigra di proprietà immutabili (val). Il valore viene calcolato al primo accesso alla proprietà e poi memorizzato nella cache.

// Esempio di utilizzo di lazy
val lazyValue: String by lazy {
    println("Inizializzazione") // verrà stampato solo una volta al primo accesso
    "Ciao, lazy!"
}

lateinit - modificatore per proprietà mutabili (var), che permette di posticipare l'inizializzazione fino al primo accesso. La proprietà deve essere non nulla. L'uso della proprietà prima dell'inizializzazione provoca un'eccezione UninitializedPropertyAccessException.

// Esempio di utilizzo di lateinit
lateinit var lateinitVariable: String

fun initializeVariable() {
    lateinitVariable = "Ciao, lateinit!"
}

fun useVariable() {
    // Verifica dell'inizializzazione prima dell'uso (opzionale, ma consigliata)
    if (::lateinitVariable.isInitialized) {
        println(lateinitVariable)
    } else {
        println("La variabile non è ancora inizializzata")
    }
}

Differenze principali:

Caratteristica lazy lateinit
Tipo di proprietà val (sola lettura) var (mutabile)
Nullabilità Può essere nullable o non nullable Deve essere non nullable
Inizializzazione Automatica, al primo accesso Manuale
Ritardo nell'inizializzazione Sì, al primo accesso Sì, dichiarazione senza inizializzazione
Sicurezza thread Per default thread-safe (sincronizzazione), opzioni disponibili Non garantito, dipende dal contesto
Eccezione all'accesso prima dell'inizializzazione No, si inizializza automaticamente UninitializedPropertyAccessException