Copiar objetos

Amigos existe uma maneira de eu copiar um objeto e não apenas utilizar sua referencia de memória?

Exemplo abaixo é simples mas eu precisaria copiar qualquer tipo de objeto:

Objeto um = “10”;
Objeto dois = um;
um = “20”;

System.out.println(um);
System.out.println(dois);

20
10

Obrigado

Object dois = um.clone();

nao entendi uma coisa, se vc quer que o objeto dois tenha o valor do objeto um…

pq v atribui 20 ao objeto 2???
ainda nao saquei o objetivo…

giovanni_stiwes tem razão mas, as referências a objetos do clone serão as mesmas do objeto clonado, para se criar uma nova estrutura é necessário que você sobrescreva o método clone.
Desculpem minha ignorância mas alguém poderia me dar um exemplo útil que poderia usar isso?

Obrigado.

Amigos desculpe demorar a responder o meu próprio tópico… mas o objetivo de querer copiar o objeto é o seguinte… e quero fazer uma copia de um objeto advindo do banco de dados para quando eu for gravar poder comprar se os objetos são iguais ou não assim gravar o log do que aconteceu!!!

Esse .clone() vai me ajudar ou ele mandem a referencia do objeto principal?

Att

O método clone() pertence à classe Object e é protected. Se o clone vai funcionar pra vc, depende da implementação que vc der, ou que foi dada por que fez a classe que vc vai utilizar. O clone() retorna (ou deve retornar, no caso de sobrescrevê-lo) uma instância diferente daquela que o invocou. Tipo assim: a expressão booleana x.clone() != x é verdadeiro, assim como também são verdadeiras x.clone().getClass() == x.getClass(), e x.clone().equals(x).
Tem só um porém que vale atenção, que é quando vc invoca o super.clone() e o “super” é a classe Object. Ela nativamente vai fazer a cópia campo-a-campo entre o objeto original e o objeto clonado. Isso implica que se a classe dos objetos tiver algum atributo que seja um objeto mutável (um campo do tipo Hashtable, por exemplo), as mudanças sofridas por este, seram refletidas nos objetos clonado e original, ou seja, esse campo será compartilhado entre o objeto original e o seu clone.

Espero ter ajudado, e se disse alguma besteira, pelo amor de Deus me corrijam!!! :lol:

samurai,

Eu uso isso para modificar objetos de um array list, que são protegidos.
Quer dizer que só posso recuperar o objeto com o get(index) e modificá-lo com o set(index, object)

ou seja: se eu preciso modificar um único campo de um objeto da lista, preciso criar uma cópia temporária deste objeto fora da lista, modificar o campo e substituir o original pela cópia dentro da lista…

fica assim:

class Interna
{
    atributo a;
    atributo b;
}

public class Externa
{

     ArrayList<Interna> lista;

     public Externa();
     {
          lista = new ArrayList<Interna>();

          //supomos que agora este construtor carregue vários objetos da classe Interna a partir de um registro externo
     }
}

Agora, se quisermos modificar algum campo de um destes registros preservando os originais, se fizermos

    Interna temp = lista.get(n);
    temp.x = outroValor;
    lista.set(n,temp);

NÃO modifica a lista

por outro lado, eu vou resolver isto assim:

   Interna temp = lista.get(n).clone();
   temp.x =outroValor;
   lista.set(n,temp);

Se alguém souber um jeito melhor por favor me diz, que eu acho um arrodeio muito grande fazer tudo isso

\o

Descobri que nem isso dá certo…

tópico com a resposta:

Desculpe posso até estar falando besteira, sou novo na área.

Mas se ao invés de criar um log comparando dois objetos iguais no final de uma rotina você pensar em registrar isso de outra forma?

Uma sugestão não muito viável mas pode ser aperfeiçoada poderia ser em seus métodos SET quando um valor for alterado registrar isso em uma variável:

setNome(String nome) {
   if (this.nome != nome) {
      this.nome = nome;
      this.log = "Atributo nome alterado para " + nome;
   }
  
}

Claro que não é o melhor dos exemplos a serem seguidos mas talvez seja uma alternativa.

Espero ter colaborado.