Sobes.tech
Middle

Qual é a diferença entre usar a palavra-chave 'lateinit' e delegar com 'by lazy {}' em Kotlin?

sobes.tech IA

Resposta da IA

O lateinit é utilizado para inicialização diferida de propriedades mutáveis (var) que não podem ser nulas e que serão inicializadas posteriormente, por exemplo, no método do ciclo de vida de uma atividade ou fragmento. O compilador não garante a inicialização, e o acesso a uma propriedade não inicializada causará uma exceção UninitializedPropertyAccessException.

by lazy {} é usado para inicialização diferida de propriedades imutáveis (val). A inicialização ocorre na primeira vez que a propriedade é acessada, e o resultado é armazenado em cache. Isto é seguro para threads por padrão e garante que o inicializador seja chamado apenas uma vez.

Característica lateinit by lazy {}
Aplicável a var val
Nullable Não nullable Não nullable
Garantia de inicialização Não (apenas pelo desenvolvedor) Sim (na primeira acessibilidade)
Segurança em threads Não garantido por padrão Sim (por padrão)
Tipo de propriedade Mutável Imutável

Exemplo com lateinit:

class MyActivity : AppCompatActivity() {

    private lateinit var textView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textView = findViewById(R.id.my_text_view)
        textView.text = "Olá, lateinit!"
    }
}

Exemplo com by lazy {}:

class MyViewModel : ViewModel() {

    private val apiService: ApiService by lazy { provideApiService() } // Inicialização na primeira utilização

    private fun provideApiService(): ApiService {
        // Lógica de criação do ApiService
        return ApiService()
    }

    fun fetchData() {
        // apiService é inicializado aqui na primeira chamada a fetchData()
        apiService.getData()
    }
}