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 ?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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!