Sobes.tech
Middle

Kokios yra savybės dirbant su konstruktoriais ir objektų inicijavimu Kotlin?

sobes.tech AI

Atsakymas iš AI

Kotlin klasės gali turėti pagrindinį konstruktorių ir vieną ar kelis antrinius konstruktorius.

Pagrindinis konstruktorius:

  • Deklaruojamas klasės antraštėje:
    class User(val vardas: String, var amžius: Int = 0) {
        // klasės turinys
    }
    
  • Neturi kūno. Inicijavimo kodas vykdomas init blokuose.
  • Savybės, deklaruotos pagrindiniame konstruktoriuje su val arba var, tampa klasės savybėmis.
  • Konstrukcijos parametrus galima naudoti init blokuose ir savybių inicijavime:
    init {
        println("Naudotojo inicializacija $vardas")
    }
    
    val aprašymas = "Naudotojas: $vardas, amžius: $amžius"
    
  • Jei pagrindinis konstruktorius neturi anotacijų ar matomumo modifikatorių, žodį constructor galima praleisti.

init blokai:

  • Turi inicializacijos kodą, kuris vykdomas kuriant klasės egzempliorių.
  • Vykdomi jų deklaravimo tvarka.
  • Vykdomi po pagrindinio konstruktoriaus iškvietimo (jei yra), bet prieš antruosius konstruktorius.

Antriniai konstruktoriai:

  • Deklaruojami su žodžiu constructor.
  • Gali deleguoti iškvietimą kitam savo klasės konstruktoriui naudojant this() arba bazinio konstruktoriaus naudojant super(). Delegacija turi būti pirmoji instrukcija.
    class User(val vardas: String) {
        constructor(vardas: String, amžius: Int) : this(vardas) {
            println("Antrinis konstruktorius")
            // papildoma inicializacijos logika
        }
    }
    
  • Jei klasė turi pagrindinį konstruktorių, visi antriniai turi aiškiai arba netiesiogiai deleguoti jam per this().

Inicijavimo tvarka:

  1. Pagrindinio konstruktoriaus kodo vykdymas (jei yra).
  2. init blokų vykdymas jų deklaravimo tvarka.
  3. Antrinio konstruktoriaus kodo vykdymas (jei naudojamas).

Pavyzdys:

class Example(vardas: String) {
    init {
        println("Pirmas init blokas $vardas")
    }

    val savybė1 = "Savybė 1"

    init {
        println("Antras init blokas $vardas")
    }

    constructor(vardas: String, amžius: Int) : this(vardas) {
        println("Antrinis konstruktorius $vardas, amžius $amžius")
    }
}

fun main() {
    val ex1 = Example("Naudotojas1") // Išves: Pirmas init blokas Naudotojas1, Antras init blokas Naudotojas1
    val ex2 = Example("Naudotojas2", 30) // Išves: Pirmas init blokas Naudotojas2, Antras init blokas Naudotojas2, Antrinis konstruktorius Naudotojas2, amžius 30
}

Pagrindinės savybės: deklaratyvus pagrindinio konstruktoriaus sintaksė, init blokų naudojimas inicializacijos logikai, aiški delegacija antruosiuose konstruktoriuose, siekiant užtikrinti nuoseklų objektų kūrimą.