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

Possível mudar a lista através de um cast

private val transacoes : MutableList<Transacao> = dao.transacoes as MutableList<Transacao>

Com isso, foi possível alterar a minha lista privada estática:

class TransacaoDAO {

    val transacoes :List<Transacao> = Companion.transacoes

    companion object {
       private var transacoes :MutableList<Transacao> = mutableListOf()
    }

Qual seria um bom método para evitar isso?

4 respostas

Oi Douglas, tudo bem?

Vejamos se entendi a sua dúvida, você quer saber se existe alguma maneira mais elegante de usar um MutableList caso receba um List?

Se sim, as alternativas são:

  • realizar o cast conforme você fez;
  • usar conversor de lista:
    • toList() quando quer mutable para immutable;
    • toMutableList() quando quer immutable para mutable;

[]s

No caso, para não deixar que alguém modifique diretamente a minha lista privada.

No vídeo, tu havia mencionado que a pessoa não conseguiria adicionar elementos a lista, visto que ao fazer a conversão da lista com o "toMutableList", ele estaria criando uma nova lista, porém eu vi que ele consegue modificar, através do cast. eu não queria que alguém que fosse utilizar minha classe DAO, conseguisse modificar a minha lista sem ser pelos métodos adiciona/remove/altera (conforme a proposta do vídeo).

solução!

Considerando que a fonte de dados é um MutableList, realmente estamos suscetíveis a essa situação, portanto, uma das alternativas seria realizar a cópia internamente:

class TransacaoDAO {

    val transacoes: List<Transacao> = Companion.transacoes.toList()

    companion object {
        private var transacoes: MutableList<Transacao> = mutableListOf()
    }

    // restante do código

}

É válido ressaltar que esse DAO é apenas para fins didáticos, ou seja, ao usar um banco de dados interno não existe a necessidade da lista estática.

Bem observado ein ;)

[]s

Tudo bem, entendi

A primeira opção que pensei quando foi até em fazer o cast, daí não tava entendendo o motivo de não funcionar, daí vi que tu havia feito o exemplo utilizando o toMutableList().

Obrigado, abraço!