En Kotlin, toute classe peut avoir un constructeur primaire (indiqué dans la déclaration de la classe) et plusieurs constructeurs secondaires (via constructor).
private, protected, internal, public), on peut masquer ou restreindre la visibilité des constructeurs.Exemple avec un constructeur primaire et des constructeurs secondaires :
open class Person(val name: String) { constructor(name: String, age: Int) : this(name) { // constructeur secondaire } } class Employee : Person { constructor(name: String) : super(name) // Appel super explicite nécessaire }
Modificateurs de visibilité :
class Secret private constructor() { companion object { fun create() = Secret() } } val s = Secret.create() // Ok, mais Secret() - erreur
Nuances :
Peut-on hériter d'une classe en Kotlin sans appeler son constructeur primaire ?
Réponse : Non. En Kotlin, lors de l'héritage, au moins un constructeur du parent doit toujours être appelé — soit le primaire, soit un secondaire (via super()).
Exemple :
open class A(val x: Int) class B: A // Erreur : le constructeur A doit être appelé explicitement
Histoire
L'équipe a essayé d'interdire la création directe d'objets de la classe et a rendu le constructeur private. Cependant, ils ont oublié de mettre en œuvre la méthode de fabrique. Cela a conduit à l'impossibilité de tester la classe sans réflexion et a bloqué CI.
Histoire
Ils ont hérité d'une classe avec des paramètres obligatoires dans le constructeur primaire, mais ne les ont pas transmis lors de la déclaration de l'héritier. Cela n'a été découvert qu'au stade de la compilation après un long débogage.
Histoire
Lors de l'utilisation de constructeurs secondaires, ils ont oublié que tous doivent appeler le primaire. En conséquence, les objets ont été initialisés sans les paramètres nécessaires, provoquant un NullPointerException à l'exécution.