Sobes.tech
Junior — Middle

Milyen sorrendben történik a tulajdonságok inicializálása és a kódrészek végrehajtása egy objektum létrehozásakor, beleértve a companion objectet, az init blokkot, a konstruktorban lévő változókat és a szokásos változókat?

sobes.tech MI

Válasz az MI-től

Amikor egy objektumot hozunk létre Kotlinban, az inicializálási sorrend a következő:

  1. A companion object inicializálása — ez egyszer történik a osztály betöltésekor, még az példányok létrehozása előtt.
  2. Az osztály törzsében deklarált tulajdonságok inicializálása (beleértve a konstruktoron kívül deklarált tulajdonságokat is) — a deklaráció sorrendjében kerülnek inicializálásra.
  3. Az init blokkok végrehajtása — a deklaráció sorrendjében futnak, közvetlenül a tulajdonságok inicializálása után.
  4. A konstruktorban deklarált tulajdonságok (pl. val/var paraméterek) inicializálása — a konstruktor hívásakor kerülnek inicializálásra.

Példa:

class Example(val constructorProp: String) {
    val property1 = println("property1 inicializálva")

    init {
        println("init blokk 1")
    }

    val property2 = println("property2 inicializálva")

    init {
        println("init blokk 2")
    }

    companion object {
        init {
            println("companion object inicializálva")
        }
    }
}

fun main() {
    val example = Example("konstruktor")
}

A kimenet kb. így fog kinézni:

companion object inicializálva
property1 inicializálva
init blokk 1
property2 inicializálva
init blokk 2

Így a companion object egyszer inicializálódik a osztály betöltésekor, majd példány létrehozásakor a tulajdonságok inicializálódnak és az init blokkok a deklaráció sorrendjében futnak, a konstruktor paraméterei pedig a konstruktor hívásakor kerülnek inicializálásra.