Sobes.tech
Middle

Koje su osobine rada sa konstruktorima i inicijalizacijom objekata u Kotlinu?

sobes.tech АИ

Одговор од АИ

U Kotlinu, klase mogu imati primarni konstruktor i jedan ili više sekundarnih konstruktora.

Primarni konstruktor:

  • Deklariše se u zaglavlju klase:
    class User(val ime: String, var starost: Int = 0) {
        // telo klase
    }
    
  • Nema telo. Inicijalni kod se izvršava u blokovima init.
  • Svojstva deklarisana u primarnom konstruktoru sa val ili var postaju svojstva klase.
  • Parametri konstruktora mogu se koristiti u blokovima init i pri inicijalizaciji svojstava:
    init {
        println("Inicijalizacija korisnika $ime")
    }
    
    val opis = "Korisnik: $ime, starost: $starost"
    
  • Ako primarni konstruktor nema anotacije ili modifikatore vidljivosti, ključna reč constructor može se izostaviti.

Blokovi init:

  • Sadrže inicijalni kod koji se izvršava pri kreiranju instance klase.
  • Izvršavaju se redom kojim su deklarisani.
  • Pokreću se nakon poziva primarnog konstruktora (ako postoji), ali pre sekundarnih konstruktora.

Sekundarni konstruktori:

  • Deklarišu se ključnom rečju constructor.
  • Mogu delegirati poziv na drugi konstruktor svoje klase pomoću this() ili konstruktor osnovne klase pomoću super(). Poziv delegacije mora biti prva instrukcija.
    class User(val ime: String) {
        constructor(ime: String, starost: Int) : this(ime) {
            println("Sekundarni konstruktor")
            // Dodatna logika inicijalizacije
        }
    }
    
  • Ako klasa ima primarni konstruktor, svi sekundarni moraju eksplicitno ili implicitno da delegiraju njemu putem this().

Redosled inicijalizacije:

  1. Izvršavanje koda primarnog konstruktora (ako postoji).
  2. Izvršavanje blokova init u redosledu njihovog deklarisanja.
  3. Izvršavanje koda sekundarnog konstruktora (ako se koristi).

Primer:

class Example(ime: String) {
    init {
        println("Prvi blok init za $ime")
    }

    val svojstvo1 = "Svojstvo 1"

    init {
        println("Drugi blok init za $ime")
    }

    constructor(ime: String, starost: Int) : this(ime) {
        println("Sekundarni konstruktor za $ime, starost $starost")
    }
}

fun main() {
    val ex1 = Example("Korisnik1") // Ispisaće: Prvi blok init za Korisnik1, Drugi blok init za Korisnik1
    val ex2 = Example("Korisnik2", 30) // Ispisaće: Prvi blok init za Korisnik2, Drugi blok init za Korisnik2, Sekundarni konstruktor za Korisnik2, starost 30
}

Ključne osobine: deklarativni sintaksis primarnog konstruktora, korišćenje blokova init za inicijalizacionu logiku, eksplicitna delegacija u slučaju sekundarnih konstruktora radi osiguranja konzistentnosti kreiranja objekata.