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 |