Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Poderia falar mais sobre essa lazy ?

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 ?

2 respostas
solução!

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!!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Perfeitamente explicado, obrigado!