Una clase en Kotlin puede tener un constructor primario y uno o más constructores secundarios. El constructor primario es parte del encabezado de la clase: va después del nombre de la clase (y los parámetros de tipo opcionales).
class Person constructor(firstName: String){ /*...*/ }
Si el constructor principal no tiene anotaciones ni modificadores de visibilidad, se puede omitir la palabra clave del constructor:
classPerson (firstName: String) { /*...*/ }
El constructor primario no puede contener ningún código. El código de inicialización se puede colocar en bloques de inicializador, que tienen como prefijo la palabra clave init.
Durante una inicialización de instancia, los bloques de inicializador se ejecutan en el mismo orden en que aparecen en el cuerpo de la clase, intercalados con los inicializadores de propiedades:
classInitOrderDemo(name: String) {
val firstProperty = "First property: $name".also(::println)
init {
println("First initializer block that prints ${name}")
}
val secondProperty = "Second property: ${name.length}".also(::println)
init {
println("Second initializer block that prints ${name.length}")
}
}
Tenga en cuenta que los parámetros del constructor primario se pueden usar en los bloques inicializadores. También se pueden usar en inicializadores de propiedades declarados en el cuerpo de la clase:
classCustomer(name: String) {
val customerKey = name.toUpperCase()
}
De hecho, para declarar propiedades e inicializarlas desde el constructor primario, Kotlin tiene una sintaxis concisa:
classPerson(val firstName: String, val lastName: String, var age: Int) { /…/ }
Al igual que las propiedades normales, las propiedades declaradas en el constructor primario pueden ser mutables (var) o de solo lectura (val).
Constructores secundarios
La clase también puede declarar constructores secundarios, que tienen el prefijo constructor:
classPerson{
varchildren: MutableList<Person> = mutableListOf<>()
constructor(parent: Person) {
parent.children.add(this)
}
}
Fuente
Documentacion de Kotlin