Blocchi init e ordine di inizializzazione
Utilizzi i blocchi init e comprenda l'ordine di inizializzazione delle proprietà e dei blocchi.
Blocchi init e ordine di inizializzazione è 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.
Che cos'è un blocco init
Un blocco init { } contiene il codice eseguito quando viene costruita un'istanza. Fa parte della logica del costruttore primario.
Blocco init semplice
Il blocco init viene eseguito durante la costruzione, dopo gli inizializzatori delle proprietà, seguendo l'ordine del codice sorgente.
class Logger(val name: String) {
init {
println("Constructed Logger("$name")")
}
}
fun main() {
val l = Logger("auth")
}Convalida in init
Utilizzi require / check all'interno di init per imporre gli invarianti al momento della costruzione.
class Percentage(val value: Int) {
init {
require(value in 0..100) { "value must be 0..100, was $value" }
}
}
fun main() {
println(Percentage(75).value)
// Percentage(150) // throws IllegalArgumentException
}Più blocchi init
È possibile avere diversi blocchi init; vengono eseguiti nell'ordine del codice sorgente, alternandosi agli inizializzatori delle proprietà.
class Demo(val x: Int) {
init { println("First init, x=$x") }
val doubled = x * 2
init { println("Second init, doubled=$doubled") }
}
fun main() {
Demo(5)
}Inizializzatori delle proprietà e ordine di init
Gli inizializzatori delle proprietà e i blocchi init vengono eseguiti dall'alto verso il basso, nell'ordine del codice sorgente. Una proprietà deve essere assegnata prima di essere utilizzata.
class Order {
val createdAt = System.currentTimeMillis()
init { println("created at $createdAt") }
val nextId = 1
init { println("next id = $nextId") }
}
fun main() {
Order()
}Non è possibile usare le proprietà prima dell'inizializzazione
Fare riferimento a una proprietà prima dell'esecuzione del relativo inizializzatore genera un errore di compilazione.
class Bad {
init {
// println(name) // ERROR: name not yet initialized
}
val name = "after init"
}
fun main() { Bad() }Calcolo delle proprietà derivate
Utilizzi i blocchi init per calcolare uno stato derivato che dipende da più parametri del costruttore.
class Rectangle(val width: Int, val height: Int) {
val area: Int
init {
area = width * height
}
}
fun main() {
val r = Rectangle(4, 5)
println("area = ${r.area}") // 20
}Effetti collaterali: logging
Utilizzi init per configurazioni non banali, come il logging, l'allocazione o la registrazione.
class Service(val name: String) {
init {
println("[BOOT] starting service '$name'")
}
}
fun main() {
Service("auth")
Service("payments")
}Ordine di init con le sottoclassi
L'init della superclasse viene eseguito prima dell'init della sottoclasse. Le proprietà di ogni classe vengono inizializzate nell'ordine del codice sorgente.
open class Base {
init { println("Base init") }
}
class Sub : Base() {
init { println("Sub init") }
}
fun main() { Sub() }Eviti la logica complessa in init
I blocchi init di lunga durata rallentano ogni costruzione. Se la configurazione è costosa, valuti l'inizializzazione lazy o l'uso di metodi factory.
class Heavy(val n: Int) {
val data: List<Int> by lazy { (1..n).toList() }
}
fun main() {
val h = Heavy(1_000_000)
println("Created without computing data")
println("First element: ${h.data[0]}") // now data initializes
}Combinazione di init e costruttori secondari
I costruttori secondari delegano al costruttore primario; i blocchi init vengono eseguiti come parte del percorso primario.
class Box(val content: String) {
init { println("init for '$content'") }
constructor(): this("empty") { println("secondary done") }
}
fun main() {
Box()
}Verifica rapida
Qual è l'ordine di esecuzione dei blocchi init e degli inizializzatori delle proprietà in una classe Kotlin?
Riepilogo
I blocchi init contengono la logica eseguita durante la costruzione: convalida, proprietà derivate ed effetti collaterali. Più blocchi vengono eseguiti nell'ordine del codice sorgente, alternandosi agli inizializzatori delle proprietà. Eviti le operazioni pesanti in init; utilizzi invece lazy o metodi factory.
Domande Frequenti
La lezione «Blocchi init e ordine di inizializzazione» è gratuita?
Sì — il testo completo di «Blocchi init e ordine di inizializzazione» è 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 «Blocchi init e ordine di inizializzazione»?
Utilizzi i blocchi init e comprenda l'ordine di inizializzazione delle proprietà e dei blocchi. 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 «Blocchi init e ordine di inizializzazione»?
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
- Costruttore primario e parametri delle proprietà
- Blocchi init e ordine di inizializzazione
- Getter e setter personalizzati con field
- lateinit e inizializzazione lazy