Sobes.tech
Junior

Pastāstiet par inicializatoriem Kotlin klasēs.

sobes.tech AI

Atbilde no AI

Kotlin klases var būt galvenais un vienu vai vairākiem sekundārajiem konstruktoriem. Inicializatori ir init bloki, kas tiek izpildīti pēc to paziņošanas secības, pēc galvenā konstruktoru (ja tas ir) vai pēc sekundārā konstruktoru, ja galvenais nav.

Galvenais konstruktoru

Tiek paziņots tieši klases virsrakstā. Tas var saturēt parametrus, kas tiek izmantoti īpašību inicializācijai.

class User(name: String, age: Int) {
    init {
        // Šis bloks tiek izpildīts, izveidojot klases instanci
        println("User created: $name, $age")
    }
}

Sekundārie konstruktoru

Tiek paziņoti ar constructor atslēgvārdu un vienmēr ir jādeleģē citam tajā pašā klasē esošam konstruktoram, vai nu galvenajam (caur this), vai citam sekundāram.

class User {
    init {
        // Šis bloks tiek izpildīts pirmais, ja ir galvenais konstruktoru
    }

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

    constructor(name: String, age: Int) : this(name) {
        // Sekundārais konstruktor 2, izsauc pirmo sekundāro
        println("User created with name and age: $name, $age")
    }
}

Izpildes secība

  1. Kods galvenajā konstruktorā (ja ir parametri, tie tiek izmantoti)
  2. init bloki secīgi
  3. Kods tajā sekundārajā konstruktorā, kas tika izsaukts (pēc deleģēšanas izsaukuma)

Piemērs izpildes secībai:

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

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

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

fun main() {
    Example(10)
}

Izvade:

Init block 1
Init block 2
Secondary constructor 10

Pat ja tiek izsaukts sekundārais konstruktor, init bloki vienmēr tiek izpildīti pirms tā ķermeņa. Tas nodrošina, ka galvenā objekta inicializācija ir pabeigta pirms specifiskā koda izpildes sekundārajā konstruktorā.

Iniciatori ir neaizvietojami, lai izpildītu loģiku, kas jāveic, izveidojot jebkuru klases instanci, neatkarīgi no tā, kurš konstruktor tiek izmantots. Piemēram, ievades datu pārbaude vai stāvokļa iestatīšana objekta.