Middle
Quali sono le caratteristiche del lavoro con i costruttori e l'inizializzazione degli oggetti in Kotlin?
sobes.tech AI
Risposta dell'AI
In Kotlin, le classi possono avere un costruttore primario e uno o più costruttori secondari.
Costruttore primario:
- Viene dichiarato nell'intestazione della classe:
class User(val name: String, var age: Int = 0) { // corpo della classe } - Non ha corpo. Il codice di inizializzazione viene eseguito nei blocchi
init. - Le proprietà dichiarate nel costruttore primario con
valovardiventano proprietà della classe. - È possibile usare i parametri del costruttore nei blocchi
inite nell'inizializzazione delle proprietà:init { println("Inizializzazione utente $name") } val description = "Utente: $name, età: $age" - Se il costruttore primario non ha annotazioni o modificatori di visibilità, la parola chiave
constructorpuò essere omessa.
Blocchi init:
- Contengono codice di inizializzazione che viene eseguito alla creazione di un'istanza della classe.
- Vengono eseguiti nell'ordine in cui sono dichiarati.
- Vengono eseguiti dopo la chiamata al costruttore primario (se presente), ma prima dei costruttori secondari.
Costruttori secondari:
- Vengono dichiarati con la parola chiave
constructor. - Possono delegare la chiamata ad un altro costruttore della stessa classe usando
this()o al costruttore della classe base usandosuper(). La chiamata di delega deve essere la prima istruzione.class User(val name: String) { constructor(name: String, age: Int) : this(name) { println("Costruttore secondario") // logica di inizializzazione aggiuntiva } } - Se la classe ha un costruttore primario, tutti i costruttori secondari devono delegare esplicitamente o implicitamente ad esso tramite
this().
Ordine di inizializzazione:
- Esecuzione del codice del costruttore primario (se presente).
- Esecuzione dei blocchi
initnell'ordine in cui sono dichiarati. - Esecuzione del codice del costruttore secondario (se usato).
Esempio:
class Example(name: String) {
init {
println("Primo blocco init per $name")
}
val property1 = "Proprietà 1"
init {
println("Secondo blocco init per $name")
}
constructor(name: String, age: Int) : this(name) {
println("Costruttore secondario per $name, età $age")
}
}
fun main() {
val ex1 = Example("Utente1") // Stampa: Primo blocco init per Utente1, Secondo blocco init per Utente1
val ex2 = Example("Utente2", 30) // Stampa: Primo blocco init per Utente2, Secondo blocco init per Utente2, Costruttore secondario per Utente2, età 30
}
Caratteristiche principali: sintassi dichiarativa del costruttore primario, uso dei blocchi init per la logica di inizializzazione, delega esplicita nei costruttori secondari per garantire la coerenza nella creazione degli oggetti.