Cuéntame sobre los inicializadores en las clases en Kotlin.
sobes.tech AI
Respuesta de la IA
En Kotlin, las clases pueden tener un constructor primario y uno o varios constructores secundarios. Los inicializadores son bloques de código init que se ejecutan en orden después de su declaración, ya sea después del constructor primario (si existe) o después del constructor secundario, si no hay uno primario.
Constructor primario
Se declara directamente en la cabecera de la clase. Puede contener parámetros que se usan para inicializar las propiedades.
class User(name: String, age: Int) {
init {
// Este bloque se ejecuta al crear una instancia de la clase
println("User created: $name, $age")
}
}
Constructores secundarios
Se declaran con la palabra clave constructor y siempre deben delegar la llamada a otro constructor de la misma clase, ya sea al primario (a través de this) o a otro secundario.
class User {
init {
// Este bloque se ejecuta primero, si hay un constructor primario
}
constructor(name: String) : this() {
// Constructor secundario 1
println("User created with name: $name")
}
constructor(name: String, age: Int) : this(name) {
// Constructor secundario 2, llama al primero secundario
println("User created with name and age: $name, $age")
}
}
Orden de ejecución
- El código en el constructor primario (si tiene parámetros, se usan esos).
- Los bloques
initen orden. - El código en el constructor secundario que fue llamado (después de delegar la llamada).
Ejemplo de orden de ejecución:
class Example {
init {
println("Init block 1")
}
constructor(i: Int) {
println("Secondary constructor $i")
}
init {
println("Init block 2")
}
}
fun main() {
Example(10)
}
Salida:
Init block 1
Init block 2
Secondary constructor 10
Incluso si se llama a un constructor secundario, los bloques init siempre se ejecutan antes de su cuerpo. Esto garantiza que la inicialización principal del objeto esté completa antes de ejecutar el código específico del constructor secundario.
Los inicializadores son imprescindibles para realizar lógica que debe ejecutarse al crear cualquier instancia de la clase, independientemente del constructor utilizado. Por ejemplo, para verificar datos de entrada o configurar el estado del objeto.