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()
}
}