Sobes.tech
Junior

Povězte mi o inicializátorech ve třídách v Kotlinu.

sobes.tech AI

Odpověď od AI

V Kotlinu mohou třídy mít primární a jeden nebo více sekundárních konstruktorů. Inicializátory jsou bloky kódu init, které se vykonávají v pořadí po jejich deklaraci, buď po primárním konstruktoru (pokud existuje), nebo po sekundárním konstruktoru, pokud primární neexistuje.

Primární konstruktor

Je deklarován přímo v hlavičce třídy. Může obsahovat parametry, které se používají k inicializaci vlastností.

class User(name: String, age: Int) {
    init {
        // Tento blok se vykoná při vytváření instance třídy
        println("Uživatel vytvořen: $name, $age")
    }
}

Sekundární konstruktor

Je deklarován klíčovým slovem constructor a musí vždy delegovat volání na jiný konstruktor téže třídy, buď na primární (přes this), nebo na jiný sekundární.

class User {
    init {
        // Tento blok se vykoná jako první, pokud existuje primární konstruktor
    }

    constructor(name: String) : this() {
        // Sekundární konstruktor 1
        println("Uživatel vytvořen s názvem: $name")
    }

    constructor(name: String, age: Int) : this(name) {
        // Sekundární konstruktor 2, volá první sekundární
        println("Uživatel vytvořen s názvem a věkem: $name, $age")
    }
}

Pořadí vykonávání

  1. Kód v primárním konstruktoru (pokud má parametry, jsou použity).
  2. Bloky init postupně.
  3. Kód v volaném sekundárním konstruktoru (po delegaci).

Příklad pořadí vykonávání:

class Example {
    init {
        println("Init blok 1")
    }

    constructor(i: Int) {
        println("Sekundární konstruktor $i")
    }

    init {
        println("Init blok 2")
    }
}

fun main() {
    Example(10)
}

Výstup:

Init blok 1
Init blok 2
Sekundární konstruktor 10

I když je volán sekundární konstruktor, bloky init se vždy vykonají před jeho tělem. To zajišťuje, že hlavní inicializace objektu je dokončena před provedením specifického kódu sekundárního konstruktoru.

Inicializátory jsou nezbytné pro provádění logiky, která musí být provedena při vytváření jakéhokoliv instance třídy, bez ohledu na použitý konstruktor. Například pro kontrolu vstupních dat nebo nastavení stavu objektu.