Sobes.tech
Middle

Quali sono le caratteristiche del lavoro con i costruttori e l'inizializzazione degli oggetti in Kotlin?

sobes.tech AI

Risposta dell'AI

In Kotlin, le classi possono avere un costruttore primario e uno o più costruttori secondari.

Costruttore primario:

  • Viene dichiarato nell'intestazione della classe:
    class User(val name: String, var age: Int = 0) {
        // corpo della classe
    }
    
  • Non ha corpo. Il codice di inizializzazione viene eseguito nei blocchi init.
  • Le proprietà dichiarate nel costruttore primario con val o var diventano proprietà della classe.
  • È possibile usare i parametri del costruttore nei blocchi init e nell'inizializzazione delle proprietà:
    init {
        println("Inizializzazione utente $name")
    }
    
    val description = "Utente: $name, età: $age"
    
  • Se il costruttore primario non ha annotazioni o modificatori di visibilità, la parola chiave constructor può essere omessa.

Blocchi init:

  • Contengono codice di inizializzazione che viene eseguito alla creazione di un'istanza della classe.
  • Vengono eseguiti nell'ordine in cui sono dichiarati.
  • Vengono eseguiti dopo la chiamata al costruttore primario (se presente), ma prima dei costruttori secondari.

Costruttori secondari:

  • Vengono dichiarati con la parola chiave constructor.
  • Possono delegare la chiamata ad un altro costruttore della stessa classe usando this() o al costruttore della classe base usando super(). La chiamata di delega deve essere la prima istruzione.
    class User(val name: String) {
        constructor(name: String, age: Int) : this(name) {
            println("Costruttore secondario")
            // logica di inizializzazione aggiuntiva
        }
    }
    
  • Se la classe ha un costruttore primario, tutti i costruttori secondari devono delegare esplicitamente o implicitamente ad esso tramite this().

Ordine di inizializzazione:

  1. Esecuzione del codice del costruttore primario (se presente).
  2. Esecuzione dei blocchi init nell'ordine in cui sono dichiarati.
  3. Esecuzione del codice del costruttore secondario (se usato).

Esempio:

class Example(name: String) {
    init {
        println("Primo blocco init per $name")
    }

    val property1 = "Proprietà 1"

    init {
        println("Secondo blocco init per $name")
    }

    constructor(name: String, age: Int) : this(name) {
        println("Costruttore secondario per $name, età $age")
    }
}

fun main() {
    val ex1 = Example("Utente1") // Stampa: Primo blocco init per Utente1, Secondo blocco init per Utente1
    val ex2 = Example("Utente2", 30) // Stampa: Primo blocco init per Utente2, Secondo blocco init per Utente2, Costruttore secondario per Utente2, età 30
}

Caratteristiche principali: sintassi dichiarativa del costruttore primario, uso dei blocchi init per la logica di inizializzazione, delega esplicita nei costruttori secondari per garantire la coerenza nella creazione degli oggetti.