Sobes.tech
Junior

Porozprávaj o inicializátoroch v triedach v jazyku Kotlin.

sobes.tech AI

Odpoveď od AI

V Kotlin môžu mať triedy primárne a jeden alebo viacero sekundárnych konštruktorov. Inicializátory sú bloky kódu init, ktoré sa vykonávajú v poradí ich vyhlásenia po primárnom konštruktorovi (ak existuje) alebo po sekundárnom konštruktorovi, ak primárny nie je.

Primárny konštruktor

Je vyhlásený priamo v hlavičke triedy. Môže obsahovať parametre, ktoré sa používajú na inicializáciu vlastností.

class User(name: String, age: Int) {
    init {
        // Tento blok sa vykoná pri vytvorení inštancie triedy
        println("User created: $name, $age")
    }
}

Sekundárne konštruktory

Vyhlasujú sa kľúčovým slovom constructor a vždy musia delegovať volanie na iný konštruktor tej istej triedy, buď primárny (cez this), alebo iný sekundárny.

class User {
    init {
        // Tento blok sa vykoná ako prvý, ak je primárny konštruktor
    }

    constructor(name: String) : this() {
        // Sekundárny konštruktor 1
        println("User created with name: $name")
    }

    constructor(name: String, age: Int) : this(name) {
        // Sekundárny konštruktor 2, volá prvý sekundárny
        println("User created with name and age: $name, $age")
    }
}

Poradie vykonávania

  1. Kód v primárnom konštruktore (ak má parametre, tie sa používajú).
  2. Bloky init postupne.
  3. Kód v sekundárnom konštruktore, ktorý bol volaný (po delegovaní volania).

Príklad poradia vykonávania:

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

    constructor(i: Int) {
        println("Secondary constructor $i")
    }

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

fun main() {
    Example(10)
}

Výstup:

Init block 1
Init block 2
Secondary constructor 10

Aj keď je volaný sekundárny konštruktor, bloky init sa vykonávajú vždy pred jeho telom. To zabezpečuje, že základná inicializácia objektu je ukončená pred vykonaním špecifického kódu sekundárneho konštruktora.

Inicializátory sú nenahraditeľné na vykonanie logiky, ktorá musí byť vykonaná pri vytvorení akéhokoľvek inštancie triedy, bez ohľadu na to, ktorý konštruktor sa používa. Napríklad na kontrolu vstupných údajov alebo nastavenie stavu objektu.