0Pricing
Kotlin Academy · Aula

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

  1. Construtor primário e parâmetros de propriedades
  2. Blocos init e ordem de inicialização
  3. Getters e setters personalizados com field
  4. lateinit e inicialização tardia
← Voltar para Kotlin Academy