Sobes.tech
Middle

Kādas ir iezīmes darbā ar konstruktoriem un objektu inicializāciju Kotlin?

sobes.tech AI

Atbilde no AI

Kotlin klases var būt galvenais konstruktoru un vienu vai vairākiem sekundārajiem konstruktoriem.

Galvenais konstruktoru:

  • Deklarēts klases virsmas:
    class User(val vārds: String, var vecums: Int = 0) {
        // klases ķermenis
    }
    
  • Tam nav ķerme. Inicializācijas kods tiek izpildīts init blokos.
  • Īpašības, kas deklarētas galvenajā konstruktorā ar val vai var, kļūst par klases īpašībām.
  • Konstrukcijas parametri var tikt izmantoti init blokos un īpašību inicializācijā:
    init {
        println("Lietotāja inicializācija $vārds")
    }
    
    val apraksts = "Lietotājs: $vārds, vecums: $vecums"
    
  • Ja galvenais konstruktoru nav anotāciju vai redzamības modifikatoru, vārdu constructor var izlaist.

init blokos:

  • Satur inicializācijas kodu, kas tiek izpildīts, izveidojot klases eksemplāru.
  • Tiek izpildīti to deklarēšanas secībā.
  • Tiek izpildīti pēc galvenā konstruktoru izsaukšanas (ja ir), bet pirms sekundārajiem konstruktoriem.

Sekundārie konstruktoru:

  • Deklarēti ar vārdu constructor.
  • Var deleģēt izsaukumu citam sava klases konstruktoram ar this() vai bāzes klases konstruktoru ar super(). Deleģācija jābūt pirmajai instrukcijai.
    class User(val vārds: String) {
        constructor(vārds: String, vecums: Int) : this(vārds) {
            println("Sekundārais konstruktor")
            // Papildu inicializācijas loģika
        }
    }
    
  • Ja klasei ir galvenais konstruktoru, visi sekundārie jādeleģē tam tieši vai netieši ar this().

Iniciācijas secība:

  1. Galvenā konstruktoru koda izpilde (ja ir).
  2. init blokos izpilde to deklarēšanas secībā.
  3. Sekundārā konstruktoru koda izpilde (ja tiek izmantots).

Piemērs:

class Example(vārds: String) {
    init {
        println("Pirmais init bloks $vārds")
    }

    val īpašība1 = "Īpašība 1"

    init {
        println("Otrais init bloks $vārds")
    }

    constructor(vārds: String, vecums: Int) : this(vārds) {
        println("Sekundārais konstruktor $vārds, vecums $vecums")
    }
}

fun main() {
    val ex1 = Example("Lietotājs1") // Izvadīs: Pirmais init bloks Lietotājs1, Otrais init bloks Lietotājs1
    val ex2 = Example("Lietotājs2", 30) // Izvadīs: Pirmais init bloks Lietotājs2, Otrais init bloks Lietotājs2, Sekundārais konstruktor Lietotājs2, vecums 30
}

Galvenās īpašības: deklaratīva galvenā konstruktoru sintakse, init bloku izmantošana inicializācijas loģikai, skaidra deleģācija sekundārajos konstruktoros, nodrošinot objekta veidošanas secību.