Ajuda com mudança de atributos em um objeto

10 respostas
javaJoni

Olá amigos do GUJ.
Estou precisando de uma ajuda num problema que está me tirando o sono:
Tenho uma aplicação que em determinado momento manda um objeto para uma classe DAO para gravar no BD.
A estrutura deste objeto é esta:
[list]Objeto da classe MovimentoBean;[/list]
[list]dentro desta existe uma Array de objetos da classe MovimentoProdutoBean;[/list]
[list]nesta existe um objeto da classe ProdutoBean;[/list]
[list]nesta existe um outro objeto da classe ProdutoBean que é um Produto vinculado ao principal;[/list]

Quando envio o objeto MovimentoBean para ser gravado ele está totalmente populado em todos os seus atributos.
Dentro da classe DAO eu preciso pegar em um for() um objeto MovimentoProdutoBean por vez(uma coleção) para gravar os itens do movimento.
O problema é que eu preciso criar um outro objeto MovimentoProdutoBean temporário para gravar em outra tabela do BD, porem com o ProdutoBean que está dentro do ProdutoBean principal.

MovimentoProdutoBean movProdAux = new MovimentoProdutoBean (); movProdAux.setProduto(movto.getListMovtoProd().get(i).getProduto().getProdVasilhame());
O objeto

movto
acima é o MovimentoBean original.

Preciso que me ajudem a saber por quê, quando seto o produto nessa linha acima, muda também o ProdutoBean principal do MovimentoProdutoBean que está na sua vez do for() e todos os seus atributos.
Já tentei criar outros objetos, mas parece que todos os objetos que receberem o MovimentoProdutoBean mudam quando seto o produto naquela linha que eu citei acima.

Se alguém puder me ajudar eu serei muito grato, pois já tentei de muitas formas e não estou conseguindo.

Desde já muito obrigado a todos.

10 Respostas

D

o metodo getProdVasilhame() esta algo parecido com isso?

Public Produto getProdVasilhame(){
return this.prodVasililhame;
}

e o setProduto esta algo assim?

Public void setProduto(Prod){
this.produto = prod;
}

??

Se sim. o que voce esta fazendo é passar a referencia do objeto, e nao ele propiamente dito.

como teste voce pode fazer o seguinte.

antes da linha que voce seta (movProdAux.setProduto(movto.getListMovtoProd().get(i).getProduto().getProdVasilhame());  )

escreva isto, pra printar a referencia do objeto

System.out.println(movto.getListMovtoProd().get(i).getProduto().getProdVasilhame());

e após a sua linha que “seta” o objeto.
voce da um print na referencia do objeto produto:
System.out.println(movProdAux.getProduto());

voce vai ver que esta esta a mesma.

javaJoni

Olá deyvidsbs,
cara, muito obrigado por ter respondido.
Quanto aos prints() eu já havia feito esse teste, porém não como vc colocou, pois dessa maneira sim os objetos prodVasilhames serão os mesmos, pois o produto é o mesmo.
no segundo print vc colocou

System.out.println(movProdAux.getProduto());

mas na verdade o meu problema é que se eu fizer

System.out.println(movto.getListMovtoProd().get(i).getProduto());

vejo que o produto é o mesmo que eu setei no objeto movProdAux. Isso que eu não estou entendendo o motivo que ele muda nos dois objetos.
Será que tem a ver com polimorfismo?

Abraço

douglaskd

javaJoni:
Olá deyvidsbs,
cara, muito obrigado por ter respondido.
Quanto aos prints() eu já havia feito esse teste, porém não como vc colocou, pois dessa maneira sim os objetos prodVasilhames serão os mesmos, pois o produto é o mesmo.
no segundo print vc colocou

System.out.println(movProdAux.getProduto());

mas na verdade o meu problema é que se eu fizer

System.out.println(movto.getListMovtoProd().get(i).getProduto());

vejo que o produto é o mesmo que eu setei no objeto movProdAux. Isso que eu não estou entendendo o motivo que ele muda nos dois objetos.
Será que tem a ver com polimorfismo?

Abraço

mostra seu for ai

D

seguindo a premissa que o metodo setProduto(), esta algo assim

Public void setProduto(Prod){  
    this.produto = prod;  
    }

Oque aconteçe é que os dois objetos estão com a mesma referencia, e nao com o valor.

Quando voce esta passando o seu objeto “ProdVasilhame” para o metodo setProduto(…),
o que o produto esta recebendo é uma copia da referencia do objeto “ProdVasilhame”.
Ou seja, quando voce chegou no setProduto(…), o java apenas “copiou” a referencia do objeto “prodVasilhame”, para o seu objeto “produto”,

em poucas palavras, eles acabaram apontando pro mesmo objeto.

material mais completo

para voce contornar isto, a varias soluçoes,

voce pode criar um metodo construtor na sua classe “Produto”, o qual recebe um produto, e voce da um set em cada atributo do objeto.

modificar o metodo setProduto, para modificar atributo por atributo,

entre outras

douglaskd
for( MovimentoProdutoBean Mpb : movto.getListMovtoProd() ){

         MovimentoProdutoBean movProdAux = new MovimentoProdutoBean ();

         movProdAux.setProduto(Mpb.getProduto().getProdVasilhame() );

         System.out.println(Mpb.getProduto()); 

         System.out.println(Mpb.getProduto().getProdVasilhame()); 
}

minha pergunta: o resultado dos dois prints esta dando o mesmo resultado ?

javaJoni

Olá douglaskd, fimeza?
Obrigado por responder.
Olha, o meu for é bastante grande e acho que até nem seria importante o for() em si.
Na verdade a capa dele é:

for(int i = 0;i < movto.getListMovtoProd().size();i++{ //código }
porque eu tenho que passar por todos os objetos MovimentoProdutoBean que possam existir dentro da lista que está no objeto MovimentoBean.
Só que quando eu crio um MovimentoProdutoBean temporário e seto nele um objeto Produto do MovimentoProdutoBean original, sendo que esse que eu estou setando é um outro objeto Produto que é o vasilhame do Produto principal que está vinculado.
Sei que parece meio confuso mas resumindo é o seguinte:
tenho que setar o objeto Produto que é o vasilhame do Produto principal do objeto MovimentoProdutoBean que está na lista dentro do objeto MovimentoBean, como o Produto principal do objeto temporário MovimentoProdutoBean.
Mas só que assim o objeto MovimentoProdutoBean do MovimentoBean está ficando com o Produto principal o mesmo do Produto que eu setei, ou seja o principal se transforma no mesmo do vasilhame.

abraço

douglaskd

javaJoni:
Olá douglaskd, fimeza?
Obrigado por responder.
Olha, o meu for é bastante grande e acho que até nem seria importante o for() em si.
Na verdade a capa dele é:

for(int i = 0;i < movto.getListMovtoProd().size();i++{ //código }
porque eu tenho que passar por todos os objetos MovimentoProdutoBean que possam existir dentro da lista que está no objeto MovimentoBean.
Só que quando eu crio um MovimentoProdutoBean temporário e seto nele um objeto Produto do MovimentoProdutoBean original, sendo que esse que eu estou setando é um outro objeto Produto que é o vasilhame do Produto principal que está vinculado.
Sei que parece meio confuso mas resumindo é o seguinte:
tenho que setar o objeto Produto que é o vasilhame do Produto principal do objeto MovimentoProdutoBean que está na lista dentro do objeto MovimentoBean, como o Produto principal do objeto temporário MovimentoProdutoBean.
Mas só que assim o objeto MovimentoProdutoBean do MovimentoBean está ficando com o Produto principal o mesmo do Produto que eu setei, ou seja o principal se transforma no mesmo do vasilhame.

abraço

eu captei seu problema, teste o código de cima, e veja se o resultado é o mesmo para comprovarmos esse erro.

javaJoni

douglaskd
o resultado é o mesmo sim, eu já havia feito o teste.
Acho que o deyvidsbs tem razão, o java deve estar copiando o mesmo produto como atributo do MovimentoProdutoBean original que está na memória.
Não sei se vc concorda com isso. Gostaria de saber sua opinião também.

abraço

douglaskd
javaJoni:
douglaskd o resultado é o mesmo sim, eu já havia feito o teste. Acho que o deyvidsbs tem razão, o java deve estar copiando o mesmo produto como atributo do MovimentoProdutoBean original que está na memória. Não sei se vc concorda com isso. Gostaria de saber sua opinião também.

abraço

cara muito estranho tudo isso. testa isso aqui:

for( MovimentoProdutoBean Mpb : movto.getListMovtoProd() ){  
      
             System.out.println(Mpb.getProduto().getProdVasilhame());  
      
             System.out.println(Mpb.getProduto());   
      
             System.out.println(Mpb.getProduto().getProdVasilhame());   
    }

e agora... os 2 ultimos estão dando o mesmo resultado ?

javaJoni

Se eu fizer isso depois de setar o objeto, na primeira linha já ocorre uma exception, pois o objeto Produto que é o vasilhame não possui vasilhame, pois nesse momento os dois objetos são os mesmos.

att

Criado 5 de junho de 2013
Ultima resposta 6 de jun. de 2013
Respostas 10
Participantes 3