Sobes.tech
Junior

Papaskinkite apie inicializatorius Kotlin klasėse.

sobes.tech AI

Atsakymas iš AI

Kotlin klasės gali turėti pagrindinį ir vieną arba kelis antrinius konstruktorius. Inicijuotojai yra init blokai, kurie vykdomi jų paskelbimo tvarka po pagrindinio konstruktoriaus (jei jis yra) arba po antrinio konstruktoriaus, jei pagrindinio nėra.

Pagrindinis konstruktorius

Jis yra tiesiogiai deklaruojamas klasės antraštėje. Jame gali būti parametrai, kurie naudojami savybių inicializacijai.

class User(name: String, age: Int) {
    init {
        // Šis blokas vykdomas kuriant klasės egzempliorių
        println("User created: $name, $age")
    }
}

Antriniai konstruktoriai

Deklaruojami su constructor raktiniu žodžiu ir visada turi deleguoti iškvietimą kitam to paties klasės konstruktoriui, arba pagrindiniam (per this), arba kitam antriniam.

class User {
    init {
        // Šis blokas vykdomas pirmas, jei yra pagrindinis konstruktorius
    }

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

    constructor(name: String, age: Int) : this(name) {
        // Antrinis konstruktorius 2, kviečia pirmą antrinį
        println("User created with name and age: $name, $age")
    }
}

Vykdymo tvarka

  1. Kodas pagrindiniame konstruktoriuje (jei yra parametrai, jie naudojami)
  2. init blokai paeiliui
  3. Kodas to antrinio konstruktoriaus, kuris buvo iškviestas (po delegavimo iškvietimo)

Pavyzdys vykdymo tvarkos:

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

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

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

fun main() {
    Example(10)
}

Išvestis:

Init block 1
Init block 2
Secondary constructor 10

Net jei iškviečiamas antrinis konstruktorius, init blokai visada vykdomi prieš jį. Tai užtikrina, kad pagrindinė objekto inicializacija yra užbaigta iki specifinio kodo vykdymo antriniame konstruktoriuje.

Inicijuotojai yra nepakeičiami vykdant logiką, kuri turi būti įvykdyta kuriant bet kurį klasės egzempliorių, nepriklausomai nuo to, kuris konstruktorius naudojamas. Pavyzdžiui, duomenų patikrinimui ar objekto būsenos nustatymui.