Sobes.tech
Middle

O que são 'lazy' e 'lateinit' em Kotlin?

sobes.tech IA

Resposta da IA

lazy - delegado de propriedade para inicialização preguiçosa de propriedades imutáveis (val). O valor é calculado na primeira referência à propriedade e depois é armazenado em cache.

// Exemplo de uso de lazy
val lazyValue: String by lazy {
    println("Inicialização") // será exibido apenas uma vez na primeira referência
    "Olá, lazy!"
}

lateinit - modificador para propriedades mutáveis (var), que permite adiar a inicialização até ao primeiro acesso. A propriedade deve ser não nula. Usar a propriedade antes da inicialização provoca uma UninitializedPropertyAccessException.

// Exemplo de uso de lateinit
lateinit var lateinitVariable: String

fun initializeVariable() {
    lateinitVariable = "Olá, lateinit!"
}

fun useVariable() {
    // Verificação de inicialização antes de usar (opcional, mas recomendada)
    if (::lateinitVariable.isInitialized) {
        println(lateinitVariable)
    } else {
        println("A variável ainda não está inicializada")
    }
}

Principais diferenças:

Característica lazy lateinit
Tipo de propriedade val (somente leitura) var (mutável)
Nullabilidade Pode ser nullable ou não nullable Deve ser não nullable
Inicialização Automática, na primeira referência Manual
Atraso na inicialização Sim, na primeira referência Sim, declaração sem inicialização
Segurança em threads Por padrão seguro em threads (sincronização), há opções Não garantido, depende do contexto
Exceção ao acessar antes da inicialização Não, inicializa automaticamente UninitializedPropertyAccessException