Empecé a aprender Kotlin. Me gustaría saber la diferencia entre el bloque de init y el constructor . ¿Cuál es la diferencia entre esto y cómo podemos usarlo para mejorar?
class Person constructor(var name: String, var age: Int) { var profession: String = "test" init { println("Test") } }El bloque de inicio se ejecutará inmediatamente después del constructor principal. Los bloques inicializadores se convierten efectivamente en parte del constructor principal. El constructor es el constructor secundario. La delegación al constructor principal ocurre como la primera declaración de un constructor secundario, por lo que el código en todos los bloques de inicialización se ejecuta antes que el cuerpo del constructor secundario.
Ejemplo
class Sample(private var s : String) { constructor(t: String, u: String) : this(t) { this.s += u } init { s += "B" } }Piensa que inicializaste la clase Sample con
Sample("T","U") Obtendrá una respuesta de cadena en la variable s como "TBU" . El valor "T" se asigna a s desde el constructor principal de la clase Sample , y luego, inmediatamente, el bloque de inicio comienza a ejecutarse y agregará "B" a la variable. Después de iniciar el bloque, el bloque constructor secundario comienza a ejecutarse y s se convertirá en "TBU" .
Ya que,
El constructor principal no puede contener ningún código.
https://kotlinlang.org/docs/reference/classes.html
Los bloques de inicio permiten agregar código al constructor principal.
Una clase en la clase Kotlin es un constructor principal (el que está después del nombre de una clase) que no contiene código, solo puede inicializar propiedades (por ejemplo class X(var prop: String) ).
El bloque init{..} en el lugar, donde puede colocar más código que se ejecutará después de inicializar las propiedades :
los bloques de inicializadores se ejecutan en el mismo orden en que aparecen en el cuerpo de la clase, intercalados con los inicializadores de propiedades
Más sobre eso está en https://kotlinlang.org/docs/reference/classes.html#constructors
Aquí hay un ejemplo:
class X(var b: String) { val a = print("a") init { print("b") } constructor() : this("aaa") { print("c") } } X() Cuando se llama, imprime abc . Por lo tanto init{..} se invoca después del constructor principal pero antes del secundario.