Sobes.tech
Middle

Care sunt caracteristicile lucrului cu constructorii și inițializarea obiectelor în Kotlin?

sobes.tech AI

Răspuns de la AI

În Kotlin, clasele pot avea un constructor primar și unul sau mai mulți constructori secundari.

Constructorul primar:

  • Se declară în antetul clasei:
    class User(val name: String, var age: Int = 0) {
        // corpul clasei
    }
    
  • Nu are corp. Codul de inițializare se execută în blocurile init.
  • Proprietățile declarate în constructorul primar cu val sau var devin proprietățile clasei.
  • Parametrii constructorului pot fi folosiți în blocurile init și la inițializarea proprietăților:
    init {
        println("Inițializare utilizator $name")
    }
    
    val description = "Utilizator: $name, vârstă: $age"
    
  • Dacă constructorul primar nu are adnotări sau modificatori de vizibilitate, cuvântul cheie constructor poate fi omis.

Blocurile init:

  • Conțin cod de inițializare care se execută la crearea unei instanțe a clasei.
  • Se execută în ordinea în care sunt declarate.
  • Se execută după apelul constructorului primar (dacă există), dar înainte de constructorii secundari.

Constructorii secundari:

  • Se declară cu cuvântul cheie constructor.
  • Pot delega apelul către alt constructor al aceleiași clase folosind this() sau către constructorul clasei de bază folosind super(). Apelul de delegare trebuie să fie prima instrucțiune.
    class User(val name: String) {
        constructor(name: String, age: Int) : this(name) {
            println("Constructor secundar")
            // logică suplimentară de inițializare
        }
    }
    
  • Dacă clasa are un constructor primar, toți constructorii secundari trebuie să îl delegateze explicit sau implicit folosind this().

Ordinea de inițializare:

  1. Executarea codului din constructorul primar (dacă există).
  2. Executarea blocurilor init în ordinea în care sunt declarate.
  3. Executarea codului din constructorul secundar (dacă este folosit).

Exemplu:

class Example(name: String) {
    init {
        println("Primul bloc init pentru $name")
    }

    val property1 = "Proprietate 1"

    init {
        println("Al doilea bloc init pentru $name")
    }

    constructor(name: String, age: Int) : this(name) {
        println("Constructor secundar pentru $name, vârstă $age")
    }
}

fun main() {
    val ex1 = Example("Utilizator1") // Va afișa: Primul bloc init pentru Utilizator1, Al doilea bloc init pentru Utilizator1
    val ex2 = Example("Utilizator2", 30) // Va afișa: Primul bloc init pentru Utilizator2, Al doilea bloc init pentru Utilizator2, Constructor secundar pentru Utilizator2, vârstă 30
}

Caracteristici cheie: sintaxă declarativă pentru constructorul primar, utilizarea blocurilor init pentru logica de inițializare, delegare explicită în cazul constructorilor secundari pentru a asigura coerența creării obiectelor.