Sobes.tech
Middle

Mik a Kotlinban a konstruktorokkal és az objektumok inicializálásával kapcsolatos jellemzők?

sobes.tech MI

Válasz az MI-től

Kotlinban az osztályoknak lehet elsődleges konstruktoruk és egy vagy több másodlagos konstruktoruk.

Elsődleges konstruktor:

  • Az osztály fejlécében van deklarálva:
    class User(val name: String, var age: Int = 0) {
        // az osztály törzse
    }
    
  • Nincs törzse. Az inicializáló kód az init blokkokban fut le.
  • Az val vagy var-rel deklarált tulajdonságok az osztály tulajdonságaivá válnak.
  • A konstruktor paramétereit az init blokkokban és a tulajdonságok inicializálásakor lehet használni:
    init {
        println("Felhasználó inicializálása $name")
    }
    
    val description = "Felhasználó: $name, életkor: $age"
    
  • Ha az elsődleges konstruktor nem tartalmaz annotációkat vagy láthatósági módosítókat, a constructor kulcsszó elhagyható.

init blokkok:

  • Olyan inicializációs kódokat tartalmaznak, amelyek a példányosítás során futnak.
  • A deklaráció sorrendjében hajtódnak végre.
  • A primér konstruktor hívása után (ha van), de a másodlagos konstruktorok előtt futnak.

Másodlagos konstruktorok:

  • A constructor kulcsszóval vannak deklarálva.
  • Delegálhatnak más konstruktorhívásra ugyanabban az osztályban a this() segítségével vagy a szülőosztály konstruktorára a super()-rel. A delegációs hívásnak az első utasításnak kell lennie.
    class User(val name: String) {
        constructor(name: String, age: Int) : this(name) {
            println("Másodlagos konstruktor")
            // kiegészítő inicializációs logika
        }
    }
    
  • Ha az osztálynak van elsődleges konstruktora, minden másodlagos konstruktor explicit vagy implicit módon delegáljon hozzá a this() segítségével.

Inicializálási sorrend:

  1. A primer konstruktor kódjának végrehajtása (ha van).
  2. Az init blokkok végrehajtása a deklaráció sorrendjében.
  3. A másodlagos konstruktor kódjának végrehajtása (ha használják).

Példa:

class Example(name: String) {
    init {
        println("Első init blokk $name számára")
    }

    val property1 = "Tulajdonság 1"

    init {
        println("Második init blokk $name számára")
    }

    constructor(name: String, age: Int) : this(name) {
        println("Másodlagos konstruktor $name számára, életkor $age")
    }
}

fun main() {
    val ex1 = Example("Felhasználó1") // Kiírja: Első init blokk Felhasználó1, Második init blokk Felhasználó1
    val ex2 = Example("Felhasználó2", 30) // Kiírja: Első init blokk Felhasználó2, Második init blokk Felhasználó2, Másodlagos konstruktor Felhasználó2, életkor 30
}

Fő jellemzők: deklaratív szintaxis az elsődleges konstruktorhoz, az init blokkok használata az inicializálási logikához, az explicit delegáció a másodlagos konstruktorokban az objektumok létrehozásának konzisztenciáját biztosítja.