Sobes.tech
Middle

Aké sú vlastnosti práce s konštruktormi a inicializáciou objektov v Kotlin?

sobes.tech AI

Odpoveď od AI

V Kotlinu môžu mať triedy primárny konštruktor a jeden alebo viac sekundárnych konštruktorov.

Primárny konštruktor:

  • Je deklarovaný v hlavičke triedy:
    class User(val meno: String, var vek: Int = 0) {
        // telo triedy
    }
    
  • Nemá telo. Inicializačný kód sa vykonáva v blokoch init.
  • Vlastnosti deklarované v primárnom konštruktoru s val alebo var sa stávajú vlastnosťami triedy.
  • Parametre konštruktora je možné používať v blokoch init a pri inicializácii vlastností:
    init {
        println("Inicializácia používateľa $meno")
    }
    
    val popis = "Používateľ: $meno, vek: $vek"
    
  • Ak primárny konštruktor nemá anotácie alebo modifikátory viditeľnosti, kľúčové slovo constructor možno vynechať.

Bloky init:

  • Obsahujú inicializačný kód, ktorý sa vykonáva pri vytváraní inštancie triedy.
  • Probíhajú v poradí, v akom sú deklarované.
  • Spúšťajú sa po volaní primárneho konštruktora (ak je), ale pred sekundárnymi konštruktormi.

Sekundárne konštruktory:

  • Sú deklarované kľúčovým slovom constructor.
  • Môžu delegovať volanie na iný konštruktor svojej triedy pomocou this() alebo na konštruktor základnej triedy pomocou super(). Delegácia musí byť prvou inštrukciou.
    class User(val meno: String) {
        constructor(meno: String, vek: Int) : this(meno) {
            println("Sekundárny konštruktor")
            // Ďalšia inicializačná logika
        }
    }
    
  • Ak má trieda primárny konštruktor, všetky sekundárne musia explicitne alebo implicitne delegovať naň cez this().

Poradie inicializácie:

  1. Spustenie kódu v primárnom konštruktore (ak je).
  2. Spustenie blokov init v poradí ich deklarácie.
  3. Spustenie kódu sekundárneho konštruktora (ak sa používa).

Príklad:

class Example(meno: String) {
    init {
        println("Prvý blok init pre $meno")
    }

    val vlastnosť1 = "Vlastnosť 1"

    init {
        println("Druhý blok init pre $meno")
    }

    constructor(meno: String, vek: Int) : this(meno) {
        println("Sekundárny konštruktor pre $meno, vek $vek")
    }
}

fun main() {
    val ex1 = Example("Používateľ1") // Vypíše: Prvý blok init pre Používateľ1, Druhý blok init pre Používateľ1
    val ex2 = Example("Používateľ2", 30) // Vypíše: Prvý blok init pre Používateľ2, Druhý blok init pre Používateľ2, Sekundárny konštruktor pre Používateľ2, vek 30
}

Kľúčové vlastnosti: deklaratívny syntax primárneho konštruktora, použitie blokov init pre logiku inicializácie, explicitná delegácia v prípade sekundárnych konštruktorov na zabezpečenie konzistencie vytvárania objektov.