Papaskinkite apie inicializatorius Kotlin klasėse.
sobes.tech AI
Atsakymas iš AI
Kotlin klasės gali turėti pagrindinį ir vieną arba kelis antrinius konstruktorius. Inicijuotojai yra init blokai, kurie vykdomi jų paskelbimo tvarka po pagrindinio konstruktoriaus (jei jis yra) arba po antrinio konstruktoriaus, jei pagrindinio nėra.
Pagrindinis konstruktorius
Jis yra tiesiogiai deklaruojamas klasės antraštėje. Jame gali būti parametrai, kurie naudojami savybių inicializacijai.
class User(name: String, age: Int) {
init {
// Šis blokas vykdomas kuriant klasės egzempliorių
println("User created: $name, $age")
}
}
Antriniai konstruktoriai
Deklaruojami su constructor raktiniu žodžiu ir visada turi deleguoti iškvietimą kitam to paties klasės konstruktoriui, arba pagrindiniam (per this), arba kitam antriniam.
class User {
init {
// Šis blokas vykdomas pirmas, jei yra pagrindinis konstruktorius
}
constructor(name: String) : this() {
// Antrinis konstruktorius 1
println("User created with name: $name")
}
constructor(name: String, age: Int) : this(name) {
// Antrinis konstruktorius 2, kviečia pirmą antrinį
println("User created with name and age: $name, $age")
}
}
Vykdymo tvarka
- Kodas pagrindiniame konstruktoriuje (jei yra parametrai, jie naudojami)
initblokai paeiliui- Kodas to antrinio konstruktoriaus, kuris buvo iškviestas (po delegavimo iškvietimo)
Pavyzdys vykdymo tvarkos:
class Example {
init {
println("Init block 1")
}
constructor(i: Int) {
println("Secondary constructor $i")
}
init {
println("Init block 2")
}
}
fun main() {
Example(10)
}
Išvestis:
Init block 1
Init block 2
Secondary constructor 10
Net jei iškviečiamas antrinis konstruktorius, init blokai visada vykdomi prieš jį. Tai užtikrina, kad pagrindinė objekto inicializacija yra užbaigta iki specifinio kodo vykdymo antriniame konstruktoriuje.
Inicijuotojai yra nepakeičiami vykdant logiką, kuri turi būti įvykdyta kuriant bet kurį klasės egzempliorių, nepriklausomai nuo to, kuris konstruktorius naudojamas. Pavyzdžiui, duomenų patikrinimui ar objekto būsenos nustatymui.