En Kotlin, cualquier clase puede tener un constructor primario (especificado en la declaración de la clase) y varios constructores secundarios (a través de constructor).
private, protected, internal, public) se puede ocultar o restringir la visibilidad de los constructores.Ejemplo con constructores primarios y secundarios:
open class Person(val name: String) { constructor(name: String, age: Int) : this(name) { // constructor secundario } } class Employee : Person { constructor(name: String) : super(name) // Se requiere super explícito }
Modificadores de visibilidad:
class Secret private constructor() { companion object { fun create() = Secret() } } val s = Secret.create() // Ok, pero Secret() - error
Matices:
¿Es posible heredar una clase en Kotlin y no invocar su constructor primario?
Respuesta: No. En Kotlin, al heredar siempre debe ser invocado al menos un constructor del padre — ya sea el primario o uno secundario (a través de super()).
Ejemplo:
open class A(val x: Int) class B: A // Error: se requiere invocar explícitamente el constructor de A
Historia
En el equipo intentaron prohibir la creación de objetos de la clase directamente y hicieron el constructor privado. Sin embargo, olvidaron implementar el método de fábrica. Esto llevó a la imposibilidad de probar la clase sin reflexión y bloqueó CI.
Historia
Heredaron una clase con parámetros obligatorios en el constructor primario, pero no los pasaron al declarar al heredero. Esto se descubrió solo en la etapa de compilación después de una larga depuración.
Historia
Al usar constructores secundarios olvidaron que todos deben invocar al primario. Como resultado, los objetos se inicializaron sin los parámetros necesarios, lo que provocó un NullPointerException en tiempo de ejecución.