Sobes.tech
Junior

Rääkige Kotlin klasside initsialiseerijatest.

sobes.tech AI

Vastus AI-lt

Kotlin klassid võivad omada põhikonstructors ja ühte või mitut sekundaarset konstruktorit. Initsialiseerijad on init plokid, mis täidetakse nende avaldamise järjekorras pärast põhikonstructors (kui see on) või pärast sekundaarset konstruktorit, kui põhikonstructor puudub.

Põhikonstructor

Deklaritakse otse klassi päises. See võib sisaldada parameetreid, mida kasutatakse omaduste initsialiseerimiseks.

class User(name: String, age: Int) {
    init {
        // See plokk täidetakse klassi eksemplari loomisel
        println("User created: $name, $age")
    }
}

Sekundaarne konstruktor

Deklaritakse constructor märksõnaga ja peab alati suunama teisele sama klassi konstruktorile, kas põhikonstructorile (this) või teisele sekundaarsele.

class User {
    init {
        // See plokk täidetakse esimese, kui on olemas põhikonstructor
    }

    constructor(name: String) : this() {
        // Sekundaarne konstruktor 1
        println("User created with name: $name")
    }

    constructor(name: String, age: Int) : this(name) {
        // Sekundaarne konstruktor 2, kutsub esimese sekundaarse
        println("User created with name and age: $name, $age")
    }
}

Täitmise järjekord

  1. Kood põhikonstructoris (kui on parameetreid, kasutatakse neid)
  2. init plokid järjekorras
  3. Kood selle sekundaarse konstruktoris, mis kutsuti (pärast delegatsiooni)

Näide täitmise järjekorrast:

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

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

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

fun main() {
    Example(10)
}

Väljund:

Init block 1
Init block 2
Secondary constructor 10

Isegi kui kutsutakse sekundaarset konstruktorit, init plokid täidetakse alati enne selle keha. See tagab, et põhine ja initsialiseerimine on lõpetatud enne spetsiaalse koodi täitmist sekundaarse konstruktoris.

Initsialiseerijad on asendamatud, et täita loogikat, mis peab toimuma iga klassi eksemplari loomisel, sõltumata sellest, millist konstruktorit kasutatakse. Näiteks sisendandmete kontroll või objekti oleku seadistamine.