In Kotlin kan elke klasse één primaire constructor hebben (gegeven in de klasseverklaring) en meerdere secundaire constructors (via constructor).
private, protected, internal, public) kunnen constructors verborgen of beperkt worden in zichtbaarheid.Voorbeeld met primaire en secundaire constructors:
open class Person(val name: String) { constructor(name: String, age: Int) : this(name) { // secundaire constructor } } class Employee : Person { constructor(name: String) : super(name) // Expliciete super vereist }
Zichtbaarheidmodificatoren:
class Secret private constructor() { companion object { fun create() = Secret() } } val s = Secret.create() // Ok, maar Secret() - fout
Nuances:
Is het mogelijk om een klasse in Kotlin te erven zonder de primaire constructor aan te roepen?
Antwoord: Nee. In Kotlin moet bij het erven altijd minstens één constructor van de ouder worden aangeroepen - ofwel de primaire, ofwel de secundaire (via super()).
Voorbeeld:
open class A(val x: Int) class B: A // Fout: vereist expliciete aanroep van de constructor A
Verhaal
In het team probeerden ze het rechtstreeks aanmaken van objecten van de klasse te verbieden en maakten de constructor private. Ze vergaten echter een fabrieksmethode te implementeren. Dit leidde tot de onmogelijkheid om de klasse zonder reflectie te testen en blokkeerde de CI.
Verhaal
Ze erfden een klasse met verplichte parameters in de primaire constructor, maar gaven ze niet door bij het verklaren van de afstammeling. Dit werd pas in de compilatiefase ontdekt na langdurige debugging.
Verhaal
Bij het gebruik van secundaire constructors vergaten ze dat ze allemaal de primaire moeten aanroepen. Dit resulteerde in objecten die werden geïnitialiseerd zonder de benodigde parameters, wat leidde tot een NullPointerException tijdens runtime.