Sobes.tech
Middle

Millised on Kotlinis konstruktoritega ja objektide initsialiseerimisega töötamise omadused?

sobes.tech AI

Vastus AI-lt

Kotlin klassid võivad omada põhikonstructorit ja üht või mitut sekundaarset konstruktorit.

Põhikonstruktor:

  • Deklareerub klassi päises:
    class User(val nimi: String, var vanus: Int = 0) {
        // klassi keha
    }
    
  • Ei oma keha. Initsialiseerimiskood täidetakse init plokkides.
  • Omadused, mis on deklareeritud põhikonstructoriga val või var, muutuvad klassi omadusteks.
  • Konstruktoriparameetreid saab kasutada init plokkides ja omaduste initsialiseerimisel:
    init {
        println("Kasutaja initsialiseerimine $nimi")
    }
    
    val kirjeldus = "Kasutaja: $nimi, vanus: $vanus"
    
  • Kui põhikonstructoril pole annotatsioone või nähtavusmooduleid, võib constructor sõna jätta vahele.

init plokid:

  • Sisaldavad initsialiseerimiskoodi, mis täidetakse klassi eksemplari loomisel.
  • Täidetakse nende deklareerimise järjekorras.
  • Täidetakse pärast põhikonstructori väljakutset (kui see on), kuid enne sekundaarseid konstruktorid.

Sekundaarne konstruktor:

  • Deklareerub sõnaga constructor.
  • Võib delegeerida teise klassi konstruktorile this() või baasklassile super(). Delegeerimine peab olema esimene käsk.
    class User(val nimi: String) {
        constructor(nimi: String, vanus: Int) : this(nimi) {
            println("Sekundaarne konstruktor")
            // Täiendav initsialiseerimine
        }
    }
    
  • Kui klassil on põhikonstructor, peavad kõik sekundaarid otseselt või kaudselt sellele delegeerima this() kaudu.

Initsialiseerimise järjekord:

  1. Põhikonstruktoril kood täidetakse (kui see on).
  2. init plokid täidetakse nende deklareerimise järjekorras.
  3. Sekundaarne konstruktor täidetakse (kui kasutatakse).

Näide:

class Example(nimi: String) {
    init {
        println("Esimene init plokk $nimi")
    }

    val omadus1 = "Omadus 1"

    init {
        println("Teine init plokk $nimi")
    }

    constructor(nimi: String, vanus: Int) : this(nimi) {
        println("Sekundaarne konstruktor $nimi, vanus $vanus")
    }
}

fun main() {
    val ex1 = Example("Kasutaja1") // Väljund: Esimene init plokk Kasutaja1, Teine init plokk Kasutaja1
    val ex2 = Example("Kasutaja2", 30) // Väljund: Esimene init plokk Kasutaja2, Teine init plokk Kasutaja2, Sekundaarne konstruktor Kasutaja2, vanus 30
}

Peamised omadused: deklaratiivne põhikonstructori süntaks, init plokkide kasutamine initsialiseerimisloogika jaoks, selge delegeerimine sekundaarsetes konstruktorites, et tagada objektide loomise järjepidevus.