Blocos init e ordem de inicialização
Use blocos init e entenda a ordem de inicialização das propriedades e dos blocos.
Blocos init e ordem de inicialização é uma aula grátis de Kotlin Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Kotlin Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Kotlin Academy inclui 4 aulas no total.
O que é um bloco init?
Um bloco init { } contém o código executado quando uma instância é construída. Ele faz parte da lógica do construtor primário.
Bloco init simples
O bloco init é executado durante a construção, depois dos inicializadores de propriedades, na ordem em que aparecem no código-fonte.
class Logger(val name: String) {
init {
println("Constructed Logger("$name")")
}
}
fun main() {
val l = Logger("auth")
}Validação em init
Use require / check dentro de init para impor invariantes no momento da construção.
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
}Vários blocos init
Você pode ter vários blocos init; eles são executados na ordem em que aparecem no código-fonte, intercalados com os inicializadores de propriedades.
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 propriedades e ordem de init
Inicializadores de propriedades e blocos init são executados de cima para baixo, na ordem do código-fonte. Uma propriedade deve receber um valor antes de ser usada.
class Order {
val createdAt = System.currentTimeMillis()
init { println("created at $createdAt") }
val nextId = 1
init { println("next id = $nextId") }
}
fun main() {
Order()
}Não é possível usar propriedades antes de inicializá-las
Referenciar uma propriedade antes da execução de seu inicializador é um erro de compilação.
class Bad {
init {
// println(name) // ERROR: name not yet initialized
}
val name = "after init"
}
fun main() { Bad() }Calculando propriedades derivadas
Use blocos init para calcular um estado derivado que dependa de vários parâmetros do construtor.
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
}Efeitos colaterais: registro de eventos
Use init para configurações não triviais, como registro de eventos, alocação ou registro.
class Service(val name: String) {
init {
println("[BOOT] starting service '$name'")
}
}
fun main() {
Service("auth")
Service("payments")
}Ordem de init com subclasses
O init da superclasse é executado antes do init da subclasse. As propriedades próprias de cada classe são inicializadas na ordem do código-fonte.
open class Base {
init { println("Base init") }
}
class Sub : Base() {
init { println("Sub init") }
}
fun main() { Sub() }Evite lógica pesada em init
Blocos init de longa duração tornam cada construção mais lenta. Considere a inicialização sob demanda ou métodos de fábrica se a configuração for custosa.
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
}Combinando init com construtores secundários
Construtores secundários delegam ao construtor primário; blocos init são executados como parte do caminho primário.
class Box(val content: String) {
init { println("init for '$content'") }
constructor(): this("empty") { println("secondary done") }
}
fun main() {
Box()
}Verificação rápida
Qual é a ordem de execução de vários blocos init e inicializadores de propriedades em uma classe Kotlin?
Recapitulação
Blocos init contêm a lógica executada durante a construção — validação, propriedades derivadas e efeitos colaterais. Vários blocos são executados na ordem do código-fonte, intercalados com inicializadores de propriedades. Evite trabalho pesado em init; use lazy ou métodos de fábrica.
Perguntas Frequentes
A aula “Blocos init e ordem de inicialização” é grátis?
Sim — o texto completo de “Blocos init e ordem de inicialização” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Kotlin Academy, atualize para CoddyKit PRO. O curso de Kotlin Academy inclui 4 aulas no total.
O que vou aprender em “Blocos init e ordem de inicialização”?
Use blocos init e entenda a ordem de inicialização das propriedades e dos blocos. Você pratica Kotlin Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Kotlin Academy?
Nenhuma experiência prévia é necessária. Kotlin Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Blocos init e ordem de inicialização”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Kotlin Academy?
Sim. Cada aula de Kotlin Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Construtor primário e parâmetros de propriedades
- Blocos init e ordem de inicialização
- Getters e setters personalizados com field
- lateinit e inicialização tardia