by lazy: approfondimento sull'inizializzazione differita
Esplori le modalità di inizializzazione lazy: SYNCHRONIZED, PUBLICATION e NONE.
by lazy: approfondimento sull'inizializzazione differita è una lezione Kotlin Academy gratuita su CoddyKit. Questa è la lezione 1 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.
Che cos'è by lazy?
by lazy rimanda l'inizializzazione di un val fino al primo accesso. La lambda viene eseguita una volta e il risultato viene memorizzato.
val greeting: String by lazy {
println("Computing...")
"Hello, Kotlin!"
}
fun main() {
println(greeting) // prints Computing... then Hello, Kotlin!
println(greeting) // prints Hello, Kotlin! (cached)
}Sintassi di lazy
Il delegato by lazy accetta una lambda che restituisce il tipo del valore, dedotto dalla dichiarazione della proprietà.
val pi: Double by lazy { Math.PI }
val appName: String by lazy { "MyApp v1.0" }
fun main() {
println(pi) // 3.141592653589793
println(appName) // MyApp v1.0
}Modalità SYNCHRONIZED (predefinita)
Per impostazione predefinita, lazy usa LazyThreadSafetyMode.SYNCHRONIZED: un solo thread inizializza il valore.
val heavyResource: String by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
Thread.sleep(100) // simulate work
"Resource ready"
}
fun main() { println(heavyResource) }Modalità PUBLICATION
PUBLICATION consente a più thread di inizializzare il valore contemporaneamente; vince il primo risultato. La usi quando l'inizializzazione è economica e priva di effetti collaterali.
val config: Map<String, String> by lazy(LazyThreadSafetyMode.PUBLICATION) {
mapOf("host" to "localhost", "port" to "8080")
}
fun main() { println(config["host"]) }Modalità NONE
NONE non introduce costi di sincronizzazione. La usi solo in contesti a thread singolo in cui le prestazioni sono importanti.
val singleThreadValue: Int by lazy(LazyThreadSafetyMode.NONE) {
42
}
fun main() { println(singleThreadValue) }Lazy in una classe
by lazy all'interno di una classe inizializza la proprietà al primo accesso, ed è utile per calcoli costosi legati allo stato dell'istanza.
class DatabaseConnection(val url: String) {
val pool: String by lazy {
println("Connecting to $url")
"Pool@$url"
}
}
fun main() {
val db = DatabaseConnection("localhost:5432")
println(db.pool)
}Lazy e lateinit
Usi by lazy per un val con un'inizializzazione complessa. Usi lateinit per un var assegnato esternamente (ad esempio nei test o tramite dependency injection).
class MyService {
val computed: List<Int> by lazy { (1..100).toList() }
lateinit var injected: String
}
fun main() {
val s = MyService()
s.injected = "injected value"
println(s.computed.size)
println(s.injected)
}Controllo isInitialized
Verifichi se una proprietà lazy è stata inizializzata con .isInitialized() — ma solo tramite il riferimento al delegato.
val myLazy: String by lazy { "initialized" }
fun main() {
val ref = ::myLazy
// No direct isInitialized on val lazy, but we can check via delegate
println(myLazy)
}Lazy con una dipendenza
Le proprietà lazy possono fare riferimento ad altre proprietà lazy, creando una catena di inizializzazione lazy.
val baseUrl: String by lazy { "https://api.example.com" }
val usersUrl: String by lazy { "$baseUrl/users" }
val postsUrl: String by lazy { "$baseUrl/posts" }
fun main() {
println(usersUrl)
println(postsUrl)
}Esempio pratico: servizio singleton
Usi by lazy nelle dichiarazioni object per inizializzare su richiesta singleton pesanti.
object Analytics {
val client: String by lazy {
println("Initializing analytics client")
"AnalyticsClient@ready"
}
}
fun main() {
println("App started")
println(Analytics.client) // initialized on first use
println(Analytics.client) // cached
}Compilazione lazy delle espressioni regolari
La compilazione di un'espressione regolare è costosa. Usi by lazy per compilarla una volta e riutilizzarla, evitando costi ripetuti.
val emailRegex: Regex by lazy {
Regex("^[A-Za-z0-9+_.-]+@(.+)$")
}
fun isValidEmail(email: String) = emailRegex.matches(email)
fun main() {
println(isValidEmail("user@example.com")) // true
println(isValidEmail("bad-email")) // false
}Verifica rapida
Quale modalità lazy dovrebbe usare in un ambiente a thread singolo per ottenere le massime prestazioni?
Riepilogo
by lazy esegue la sua lambda una volta al primo accesso e memorizza il risultato. Scelga SYNCHRONIZED (predefinita) per la sicurezza dei thread, PUBLICATION per un'inizializzazione concorrente idempotente e NONE per le prestazioni in ambienti a thread singolo.
Domande Frequenti
La lezione «by lazy: approfondimento sull'inizializzazione differita» è gratuita?
Sì — il testo completo di «by lazy: approfondimento sull'inizializzazione differita» è 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 «by lazy: approfondimento sull'inizializzazione differita»?
Esplori le modalità di inizializzazione lazy: SYNCHRONIZED, PUBLICATION e NONE. 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 1 di 4.
Quanto tempo richiede la lezione «by lazy: approfondimento sull'inizializzazione differita»?
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
- by lazy: approfondimento sull'inizializzazione differita
- Delegati observable e vetoable
- Scrivere un delegato ReadWriteProperty personalizzato
- Delegati per Preferences, proprietà basate su Map e logging