Sobes.tech
Junior

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

  1. El código en el constructor primario (si tiene parámetros, se usan esos).
  2. Los bloques init en orden.
  3. 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.