Sobes.tech
Junior

Fale sobre os inicializadores em classes na linguagem Kotlin.

sobes.tech IA

Resposta da IA

No Kotlin, as classes podem ter um construtor primário e um ou mais construtores secundários. Os inicializadores são blocos de código init que são executados na ordem após sua declaração, seja após o construtor primário (se existir) ou após o construtor secundário, se não houver um primário.

Construtor primário

É declarado diretamente na cabeça da classe. Pode conter parâmetros usados para inicializar as propriedades.

class User(name: String, age: Int) {
    init {
        // Este bloco é executado ao criar uma instância da classe
        println("User criado: $name, $age")
    }
}

Construtores secundários

São declarados com a palavra-chave constructor e sempre devem delegar a chamada para outro construtor da mesma classe, seja ao primário (através de this) ou a outro secundário.

class User {
    init {
        // Este bloco é executado primeiro, se houver um construtor primário
    }

    constructor(name: String) : this() {
        // Construtor secundário 1
        println("User criado com nome: $name")
    }

    constructor(name: String, age: Int) : this(name) {
        // Construtor secundário 2, chama o primeiro secundário
        println("User criado com nome e idade: $name, $age")
    }
}

Ordem de execução

  1. O código no construtor primário (se tiver parâmetros, eles são usados).
  2. Os blocos init em sequência.
  3. O código no construtor secundário que foi chamado (após delegar a chamada).

Exemplo de ordem de execução:

class Example {
    init {
        println("Bloco init 1")
    }

    constructor(i: Int) {
        println("Construtor secundário $i")
    }

    init {
        println("Bloco init 2")
    }
}

fun main() {
    Example(10)
}

Saída:

Bloco init 1
Bloco init 2
Construtor secundário 10

Mesmo que um construtor secundário seja chamado, os blocos init sempre são executados antes do seu corpo. Isso garante que a inicialização principal do objeto seja concluída antes de executar o código específico do construtor secundário.

Os inicializadores são essenciais para executar lógica que deve ser realizada ao criar qualquer instância da classe, independentemente do construtor utilizado. Por exemplo, para verificar dados de entrada ou configurar o estado do objeto.