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
- O código no construtor primário (se tiver parâmetros, eles são usados).
- Os blocos
initem sequência. - 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.