Ola pessoal,
Estou com uma duvida, gostaria de saber o porque ocorre a copia indevida de valores em listas completamente distintas.
Em seguida, o meu codigo e a explicação do que exatamente ocorre.
[code] public DualListModel pickListAtividades() {
List<Atividade> target = getAtividades();
List<Atividade> source = getAtividades();
DualListModel<Atividade> dualAtividades;
//link of Task (selected) and Activity on Task map,
// working like a memory for activities changes on pickList (primefaces), deleted and added
if (mapTarefa.containsKey(tarefa)){
dualAtividades = mapTarefa.get(tarefa);
return dualAtividades;
}else{
Collection<DualListModel<Atividade>> coll = mapTarefa.values();
List<DualListModel<Atividade>> listDualList = new ArrayList<DualListModel<Tarefa>>(coll);
for (DualListModel<Atividade> dualListModel : listDualList) {
List<Atividade> _target = dualListModel.getTarget();
for(Atividade ac : _target) {
target.add(ac);
}
List<Atividade> _source = dualListModel.getSource();
for(Atividade ac : _source){
source.add(ac);
}
}
dualAtividades = new DualListModel<Atividades>(source,target);
return dualAtividades;
}
}[/code]
Bem, o resultado do topico é visto nessa linha do codigo:
dualAtividades= new DualListModel<Atividades>(source,target);
O que acontece, bizarramente, é a copia indevida de valores de uma lista para a outra, sendo que não estou realizando nenhuma operação entre essas listas.
Apos debugar o codigo percebi que a cada iteração do primeiro for (1) ela realiza a copia dos elementos “adicionados” na lista target para a lista dualListModel.getSource()
b[/b]
for(Atividade ac : _target) {
target.add(ac);
}
Quando é feito a copia dos elementos da lista _source para a lista source, é realizado a copia dos mesmos valores que tem a lista _target.
Alguém poderia me explicar o que ocorre e o porque ?
Muito obrigado.
(espero que a pergunta tenha ficado clara, qualquer duvida so perguntar)
Cara, nunca utilizei DualListModel, mas me parece q no início do código vc está atribuindo a mesma lista para “target” e para “source”, essa parte não está errada?
List<Atividade> target = getAtividades(); // target e source possuem os mesmos valores
List<Atividade> source = getAtividades();
Então fabiocortolan,
Olha so…
getAtividades() ira retornar uma lista.
public List<Activite> getActivites() {
if (activites == null ){
activites = new ArrayList<Activite>();
}
return activites;
}
Então, então creio eu que não ha sentido dar problema ai.
O problema é na DualListModel, pois no mesmo momento que eu copio os elementos da lista _target para target, os elementos são copiados de _target para _source (isso eu vi durante o debug na DualListModel).
Acho q vc mesmo já respondeu seu problema! Qdo vc chama “getAtividades()”, vc verifica se “activites” é null, como essa variável está na mesma instância dos outros métodos q vc postou a primeiva vez ela é null, já na segunda ela possui a mesma instância, nesse caso target e source possuem a mesma instância da lista “activites”, nesse caso qdo vc modifica target, source será modificado tbm e vice versa. Vou comentar os códigos para tentar esclarecer melhor:
public List<Activite> getActivites() {
if (activites == null ){
activites = new ArrayList<Activite>(); // código executado em "target"
}
return activites; // código executado em "source" - retorna a mesma instância da lista de target
}
// ...
List<Atividade> target = getAtividades(); // Aki ele entra dentro do if, já que "activites" é null
List<Atividade> source = getAtividades(); // Aki ele pegou a mesma lista de cima, já "activites" não é mais null
Rapaz, e não é que funcionou mesmo ?
Inicializei ambas as listas com o new ArrayList(); e funcionou.
O sistema se tornou grande e não prestei atenção a esse detalhe quando voltei pra essa parte do desenvolvimento.
Muito obrigado por ter feito atenção à isso !
E qual o problema com a DualListModel ?
[quote=andrielc]
…
E qual o problema com a DualListModel ?[/quote]
Não sei se existe algum problema em usar DualListModel, até hj eu não tinha visto nada a respeito dessa API…
Ah, ok.
Utilizei ela para reduzir a quantidade de variavel e se tornou util para o que eu realizei, como a operação de memoria.
Obrigado.