Middle
Jaké jsou vlastnosti práce s konstruktory a inicializací objektů v Kotlinu?
sobes.tech AI
Odpověď od AI
V Kotlinu mohou třídy mít primární konstruktor a jeden nebo více sekundárních konstruktorů.
Primární konstruktor:
- Je deklarován v hlavičce třídy:
class User(val jméno: String, var věk: Int = 0) { // tělo třídy } - Nemá tělo. Inicializační kód se provádí v blocích
init. - Vlastnosti deklarované v primárním konstruktoru s
valnebovarse stávají vlastnostmi třídy. - Parametry konstruktoru lze používat v blocích
inita při inicializaci vlastností:init { println("Inicializace uživatele $jméno") } val popis = "Uživatel: $jméno, věk: $věk" - Pokud primární konstruktor nemá anotace nebo modifikátory viditelnosti, lze klíčové slovo
constructorvynechat.
Bloky init:
- Obsahují inicializační kód, který se provádí při vytváření instance třídy.
- Probíhají v pořadí, v jakém jsou deklarovány v třídě.
- Spouštějí se po volání primárního konstruktoru (pokud je), ale před voláním sekundárních konstruktorů.
Sekundární konstruktor:
- Je deklarován klíčovým slovem
constructor. - Může delegovat volání na jiný konstruktor své třídy pomocí
this()nebo konstruktor základní třídy pomocísuper(). Volání delegace musí být první instrukcí.class User(val jméno: String) { constructor(jméno: String, věk: Int) : this(jméno) { println("Sekundární konstruktor") // Další inicializační logika } } - Pokud má třída primární konstruktor, všechny sekundární konstruktor musí výslovně nebo nepřímo delegovat na něj přes
this().
Pořadí inicializace:
- Provádění kódu primárního konstruktoru (pokud je).
- Provádění bloků
initv pořadí jejich deklarace. - Provádění kódu sekundárního konstruktoru (je-li použit).
Příklad:
class Example(jméno: String) {
init {
println("První blok init pro $jméno")
}
val vlastnost1 = "Vlastnost 1"
init {
println("Druhý blok init pro $jméno")
}
constructor(jméno: String, věk: Int) : this(jméno) {
println("Sekundární konstruktor pro $jméno, věk $věk")
}
}
fun main() {
val ex1 = Example("Uživatel1") // Vypíše: První blok init pro Uživatel1, Druhý blok init pro Uživatel1
val ex2 = Example("Uživatel2", 30) // Vypíše: První blok init pro Uživatel2, Druhý blok init pro Uživatel2, Sekundární konstruktor pro Uživatel2, věk 30
}
Klíčové vlastnosti: deklarativní syntaxe primárního konstruktoru, použití bloků init pro inicializační logiku, explicitní delegace v případě sekundárních konstruktorů pro zajištění konzistence tvorby objektů.