Bloques init y orden de inicialización
Use bloques init y comprenda el orden de inicialización de propiedades y bloques.
Bloques init y orden de inicialización es una lección gratuita de Kotlin Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Kotlin Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Kotlin Academy incluye 4 lecciones en total.
¿Qué es un bloque init?
Un bloque init { } contiene el código que se ejecuta cuando se construye una instancia. Forma parte de la lógica del constructor primario.
Bloque init sencillo
El bloque init se ejecuta durante la construcción, después de los inicializadores de propiedades y en el orden en que aparecen en el código fuente.
class Logger(val name: String) {
init {
println("Constructed Logger("$name")")
}
}
fun main() {
val l = Logger("auth")
}Validación en init
Use require / check dentro de init para imponer invariantes durante la construcción.
class Percentage(val value: Int) {
init {
require(value in 0..100) { "value must be 0..100, was $value" }
}
}
fun main() {
println(Percentage(75).value)
// Percentage(150) // throws IllegalArgumentException
}Varios bloques init
Puede tener varios bloques init; se ejecutan en el orden en que aparecen en el código fuente, intercalados con los inicializadores de propiedades.
class Demo(val x: Int) {
init { println("First init, x=$x") }
val doubled = x * 2
init { println("Second init, doubled=$doubled") }
}
fun main() {
Demo(5)
}Inicializadores de propiedades y orden de init
Los inicializadores de propiedades y los bloques init se ejecutan de arriba abajo, en el orden en que aparecen en el código fuente. Una propiedad debe asignarse antes de utilizarla.
class Order {
val createdAt = System.currentTimeMillis()
init { println("created at $createdAt") }
val nextId = 1
init { println("next id = $nextId") }
}
fun main() {
Order()
}No puede usar propiedades antes de inicializarlas
Hacer referencia a una propiedad antes de que se ejecute su inicializador provoca un error de compilación.
class Bad {
init {
// println(name) // ERROR: name not yet initialized
}
val name = "after init"
}
fun main() { Bad() }Calcular propiedades derivadas
Use bloques init para calcular el estado derivado que dependa de varios parámetros del constructor.
class Rectangle(val width: Int, val height: Int) {
val area: Int
init {
area = width * height
}
}
fun main() {
val r = Rectangle(4, 5)
println("area = ${r.area}") // 20
}Efectos secundarios: registro
Use init para tareas de configuración no triviales, como registrar información, reservar recursos o realizar registros.
class Service(val name: String) {
init {
println("[BOOT] starting service '$name'")
}
}
fun main() {
Service("auth")
Service("payments")
}Orden de init con subclases
El init de la superclase se ejecuta antes que el init de la subclase. Las propiedades propias de cada clase se inicializan en el orden en que aparecen en el código fuente.
open class Base {
init { println("Base init") }
}
class Sub : Base() {
init { println("Sub init") }
}
fun main() { Sub() }Evitar lógica pesada en init
Los bloques init de larga duración ralentizan cada construcción. Considere la inicialización diferida o los métodos de fábrica si la configuración es costosa.
class Heavy(val n: Int) {
val data: List<Int> by lazy { (1..n).toList() }
}
fun main() {
val h = Heavy(1_000_000)
println("Created without computing data")
println("First element: ${h.data[0]}") // now data initializes
}Combinar init con constructores secundarios
Los constructores secundarios delegan en el constructor primario; los bloques init se ejecutan como parte de la ruta del constructor primario.
class Box(val content: String) {
init { println("init for '$content'") }
constructor(): this("empty") { println("secondary done") }
}
fun main() {
Box()
}Comprobación rápida
¿Cuál es el orden de ejecución de varios bloques init e inicializadores de propiedades en una clase de Kotlin?
Resumen
Los bloques init contienen la lógica que se ejecuta durante la construcción: validación, propiedades derivadas y efectos secundarios. Los bloques múltiples se ejecutan en el orden en que aparecen en el código fuente, intercalados con los inicializadores de propiedades. Evite realizar tareas pesadas en init; use lazy o métodos de fábrica.
Preguntas frecuentes
¿La lección «Bloques init y orden de inicialización» es gratis?
Sí — el texto completo de «Bloques init y orden de inicialización» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Kotlin Academy, actualiza a CoddyKit PRO. El curso de Kotlin Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Bloques init y orden de inicialización»?
Use bloques init y comprenda el orden de inicialización de propiedades y bloques. Practicas Kotlin Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Kotlin Academy?
No se requiere experiencia previa. Kotlin Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Bloques init y orden de inicialización»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Kotlin Academy?
Sí. Cada lección de Kotlin Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Constructor primario y parámetros de propiedades
- Bloques init y orden de inicialización
- Getters y setters personalizados con field
- lateinit e inicialización diferida