Copiando um objeto

8 respostas
carlos_maia

Ola pessoal , tudo bem com vcs?

to precisando de uma ajudinha

Eu tenho um determinado objeto por exemplo (Pessoa) que tem os atributos(id=1,nome=paulo”,dataInicio=01/01/2010)

ai eu crio um novo objeto pessoa e atribuo os atributos do objeto Pessoa Antigo

novaPessoa = pessoa;

agora eu pego e coloco para este novaPessoa a data inicio null;
novaPessoa.setDataInicio(null) ;

quando eu vi alem de ter alterado a data da pessoa nova ele alterou tambem o da pessoa antiga;

a pergunta é a seguinte?
Como eu faço pra fazer esta atribuição onde eu não tenho que alterar os atributos da pessoa antiga?

8 Respostas

lucas_carvalho100

Cara isso acontece pq os dois objetos estão usando o mesmo endereço de memória… passe os valores para outra classe não o objeto todo…

Hebert_Coelho

Cara, note o seguinte:

Pessoa a = new Pessoa();
Pessoa b = a;

Vc está falando,

Ei, objeto A vc vai receber uma pessoa nova. Já vc, objeto B vai apontar para a mesma pessoa que o A está apontando.

Por isso que quando vc altera em um, o resultado está alterado no outro tb! [=

R

tem o codigo ai[url]?

S

Se você estiver usando atributos static também irá ocorrer este problema…

marcos1EM

Se vc quer manipular uma cópia do objeto sem ter vinculo com o objeto original, vc pode usar o metodo clone. para isso vc deve implementar a interface Cloneable em sua classe por exemlo:

public class MinhaClasse  implements Cloneable {
//atributos
 //gets e sets

}

 MinhaClasse   cAntiga; // objeto q sera clonado estando portando com os atributos ja setados

  MinhaClasse  cNova=  cNova = (MinhaClasse) cAntiga.clone(); //Fazendo a cópia
leonardofl

Na verdade eu não sei bem o porquê, mas sei que o método clone() não é algo muito trivial de se usar, pois pode trazer algumas complicações, sendo melhor evitá-lo a menos que você realmente entenda como funciona.

Alguns links:
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#clone()
http://www.javapractices.com/topic/TopicAction.do?Id=71

Então a melhor solução parece ser mesmo um método que copia na mãos os campos de uma classe para uma nova classe. Mas cuidado… se vc copiar campos que sejam objetos (não primitivos, ex: atributo Dog da classe Pessoa) com o operador “=” pode acabar com o mesmo problema,

carlos_maia

Ola pessoal consegui resolver passando todos os atributos do objeto antigo para o novo objeto através do set

objNovo.setNome(objAntigo.getNome)

Obrigado

D

@carlos maia,

Muito importante isto: em Java a String por padrão (da JVM) é 1 Objeto Imutável.
Então, os testes q v6 fizeram “podem” estar furados…
Explico: se a sua Classe tiver qualquer Atributo, q é 1 Objeto de outra Classe, (q não seja Imutável), na verdade, no Objeto de origem, pode estar contendo a mesma referencia do AtributoObjeto, no Objeto de destino, entende??!
Uma solução realmente efetiva seria fazer a combinação de 2 técnicas|padrões: o Defensive copying com o Copy constructors
Desta forma o State das suas Classes Entidades de Negócio estará mais seguro, mesmo elas transitando no Front-End!! 8)
Espero ter contribuido…

Criado 10 de agosto de 2010
Ultima resposta 12 de ago. de 2010
Respostas 8
Participantes 8