Sobes.tech
Junior

Beszélj az inicializálókról Kotlin nyelvű osztályokban.

sobes.tech MI

Válasz az MI-től

Kotlinban az osztályoknak lehet elsődleges és egy vagy több másodlagos konstruktoruk. Az inicializálók init blokk kódok, amelyek a deklarációjuk után, sorrendben futnak le, az elsődleges konstruktor (ha van) vagy a másodlagos konstruktor futása után, ha elsődleges nincs.

Elsődleges konstruktor

Közvetlenül az osztály fejlécében van deklarálva. Tartalmazhat paramétereket, amelyeket az attribútumok inicializálására használnak.

class User(name: String, age: Int) {
    init {
        // Ez a blokk az osztály példányának létrehozásakor fut
        println("Felhasználó létrehozva: $name, $age")
    }
}

Másodlagos konstruktorok

A constructor kulcsszóval vannak deklarálva, és mindig delegálniuk kell egy másik konstruktor hívására ugyanabban az osztályban, akár az elsődlegesre (this), akár egy másik másodlagosra.

class User {
    init {
        // Ez a blokk elsőként fut, ha van elsődleges konstruktor
    }

    constructor(name: String) : this() {
        // Másodlagos konstruktor 1
        println("Felhasználó létrehozva névvel: $name")
    }

    constructor(name: String, age: Int) : this(name) {
        // Másodlagos konstruktor 2, meghívja az első másodlagost
        println("Felhasználó létrehozva névvel és életkornál: $name, $age")
    }
}

Végrehajtási sorrend

  1. A kód az elsődleges konstruktorban (ha vannak paraméterek, azok használódnak).
  2. Az init blokkok sorrendben.
  3. A hívott másodlagos konstruktor kódja (delegálás után).

Példa végrehajtási sorrendre:

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

    constructor(i: Int) {
        println("Másodlagos konstruktor $i")
    }

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

fun main() {
    Example(10)
}

Kimenet:

Init blokk 1
Init blokk 2
Másodlagos konstruktor 10

Még akkor is, ha másodlagos konstruktor hívódik meg, az init blokkok mindig azelőtt futnak, hogy a másodlagos konstruktor törzse végrehajtódna. Ez garantálja, hogy az objektum fő inicializálása befejeződött, mielőtt a másodlagos konstruktor specifikus kódja futna.

Az inicializálók elengedhetetlenek a logika végrehajtásához, amelyet minden példány létrehozásakor végre kell hajtani, függetlenül attól, hogy melyik konstruktor van használatban. Például bemeneti adatok ellenőrzésére vagy az objektum állapotának beállítására.