Sobes.tech
Middle

Quando deve usar 'lateinit' e 'by lazy' em Kotlin?

sobes.tech IA

Resposta da IA

O lateinit é usado para propriedades não nulas que serão inicializadas posteriormente, antes do primeiro acesso a elas. Aplica-se com var.

class UserActivity : AppCompatActivity() {
    lateinit var binding: ActivityUserBinding // Será inicializado no onCreate

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityUserBinding.inflate(layoutInflater)
        setContentView(binding.root)
        // Agora pode usar binding
    }
}

by lazy é usado para propriedades não nulas ou nulas, que são inicializadas no primeiro acesso. Aplica-se com val.

class DataManager {
    val apiService: ApiService by lazy {
        Retrofit.Builder()
            .baseUrl("https://api.example.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(ApiService::class.java)
    }
}

Comparação:

Característica lateinit by lazy
Uso var val
Tipo de propriedade Não nulo Não nulo ou nulo
Inicialização Tardia, manualmente Na primeira acesso, automaticamente
Segurança de threads Não garantido por padrão (se não sincronizado manualmente) Garantido por padrão (sincronizado)
Valor nulo Não permitido antes da inicialização (lança exceção) Não (tipo definido pelo inicializador)

Use lateinit quando o valor da propriedade depende do contexto ou de outros fatores e deve ser definido após a criação do objeto, mas antes de seu uso (por exemplo, ao fazer binding de views em uma Activity Android).

Use by lazy para propriedades que são caras de criar ou que podem não ser necessárias durante toda a vida do objeto, ou quando a inicialização deve ser adiada até o primeiro uso real.