Sobes.tech
Middle

Quelles sont les caractéristiques du travail avec les constructeurs et l'initialisation des objets en Kotlin?

sobes.tech IA

Réponse de l'IA

En Kotlin, les classes peuvent avoir un constructeur primaire et un ou plusieurs constructeurs secondaires.

Constructeur primaire :

  • Déclaré dans la déclaration de la classe :
    class User(val name: String, var age: Int = 0) {
        // corps de la classe
    }
    
  • N'a pas de corps. Le code d'initialisation s'exécute dans les blocs init.
  • Les propriétés déclarées dans le constructeur primaire avec val ou var deviennent des propriétés de la classe.
  • On peut utiliser les paramètres du constructeur dans les blocs init et lors de l'initialisation des propriétés :
    init {
        println("Initialisation de l'utilisateur $name")
    }
    
    val description = "Utilisateur : $name, âge : $age"
    
  • Si le constructeur primaire n'a pas d'annotations ou de modificateurs de visibilité, le mot-clé constructor peut être omis.

Blocs init :

  • Contiennent du code d'initialisation qui s'exécute lors de la création d'une instance de la classe.
  • S'exécutent dans l'ordre dans lequel ils sont déclarés.
  • S'exécutent après l'appel au constructeur primaire (s'il existe), mais avant les constructeurs secondaires.

Constructeurs secondaires :

  • Déclarés avec le mot-clé constructor.
  • Peuvent déléguer l'appel à un autre constructeur de la même classe avec this() ou au constructeur de la classe de base avec super(). L'appel à la délégation doit être la première instruction.
    class User(val name: String) {
        constructor(name: String, age: Int) : this(name) {
            println("Constructeur secondaire")
            // logique supplémentaire d'initialisation
        }
    }
    
  • Si la classe a un constructeur primaire, tous les constructeurs secondaires doivent déléguer explicitement ou implicitement à celui-ci via this().

Ordre d'initialisation :

  1. Exécution du code du constructeur primaire (s'il existe).
  2. Exécution des blocs init dans l'ordre.
  3. Exécution du code du constructeur secondaire (si utilisé).

Exemple :

class Example(name: String) {
    init {
        println("Premier bloc init pour $name")
    }

    val property1 = "Propriété 1"

    init {
        println("Deuxième bloc init pour $name")
    }

    constructor(name: String, age: Int) : this(name) {
        println("Constructeur secondaire pour $name, âge $age")
    }
}

fun main() {
    val ex1 = Example("Utilisateur1") // Affiche : Premier bloc init pour Utilisateur1, Deuxième bloc init pour Utilisateur1
    val ex2 = Example("Utilisateur2", 30) // Affiche : Premier bloc init pour Utilisateur2, Deuxième bloc init pour Utilisateur2, Constructeur secondaire pour Utilisateur2, âge 30
}

Caractéristiques clés : syntaxe déclarative du constructeur primaire, utilisation des blocs init pour la logique d'initialisation, délégation explicite dans les constructeurs secondaires pour assurer la cohérence de la création des objets.