No fórum que foi indicado apenas fala para colocar o lazy, mas oque é isso? Onde posso procurar mais informações sobre ele ? É parecido com o lateinit ?
No fórum que foi indicado apenas fala para colocar o lazy, mas oque é isso? Onde posso procurar mais informações sobre ele ? É parecido com o lateinit ?
Olá Gabriel, tudo bem ?
Na inicialização by lazy você pode iniciar ela já com o val, após isso atribuir algum valor nela que só será iniciado/acessado quando essa val for chamada deixando assim o valor como um "cache". Aqui vai um exemplo:
private val nome : String by lazy {
"Matheus"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
println(nome)
}
Nesse exemplo a property nome só vai ser iniciada no código quando for chamada .
Já no lateinit só podemos utilizar a keywork var, isso se deve por conta de sua atribuição tardia, nós declaramos ela sem um valor específico no começo e em algum outro momento do código, ação do usuário ou qualquer outro input seja alocado à ela. Vamos a mais um exemplo:
private lateinit var nome : String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
nome = "Matheus"
println(nome)
}
Aqui nesse exemplo nós iniciamos a variável nome e só declaramos seu tipo (String) mas sem nenhuma atribuição, sem o lateinit teríamos um erro de variável não atribuída, mais à frente no código eu atribuí um valor a ela que poderia ter vindo de diversas formas, seja por um formulário, pelo prompt ou até mesmo de alguma web API.
Resumindo os casos de uso, você pode utilizar o by lazy para um valor imutável que você quer garantir a execução no tempo correto, como por exemplo para respeitar o ciclo de vida de uma activity. Com o lateinit você pode atribuir um valor mais a frente ao código, se assemelha bastante as inicializações em java onde você pode instanciar uma variável e atribuir um valor mais tarde, caso não atribua seu código vai crashar e levantar a exception de lateinit property nome has not been initialized.
Qualquer dúvida, estarei à disposição.
Forte abraço e bons estudos!!
Perfeitamente explicado, obrigado!