Sobes.tech
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 val nebo var se stávají vlastnostmi třídy.
  • Parametry konstruktoru lze používat v blocích init a 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 constructor vynechat.

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:

  1. Provádění kódu primárního konstruktoru (pokud je).
  2. Provádění bloků init v pořadí jejich deklarace.
  3. 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ů.