Como eu crio uma cópia de um objeto?

8 respostas
renatotn7

o metodo clone so serve para arraylists…

8 Respostas

dicabeca

cara faz um “cast” !!!

public class Pessoa { private String nome; public boolean equals(Object other) { Pessoa pessoa = (Pessoa)other; // olha o cast aê geeeente!!! return pessoa.nome.equals(nome); } }

gomesrod

O método Clone não serve apanas para ArrayLists, mas sim para qualquer classe que implemente a interface Cloneable. Talvez seja isso o que está faltando no seu caso!

gomesrod

Ops, correção!!!

Acho que eu me precipitei um pouco na resposta anterior: Essa solução só vai funcionar se o objeto a ser clonado é de uma classe criada por você, claro.
Afinal, se é de uma classe pronta não há como implementar a interface e consequentemente usar o método clone(). Nesse caso, também gostaria de saber como fazê-lo…

sergiotaborda

O método clone pertence a Object mas é protected. O que significa que tem que implementar a interface clonable para que ele esteja disponivel para uso.

A forma padrão de criar esse método é criar um construtor que recebe um outro objecto da mesma classe e dentro do construtor copiar os campos.

class A  implements Cloneable{

   int a;
   int b;

  public A() {} // constutor normal
   
  protected A(A other) {
          this.a = other.a;
           this.b = other.b;
  }

  public Object clone (){
        return new A(this);
 }
 
}

O contrutor de clonagem pode ser publico se necessário para outros fins.

No caso de ArrayList a clonagem é feita do array e não dos objetos dentro do array. Ou seja, é criado uma segunda lista, em que remover e adicionar elementos não interfere com a lista original, mas os elementos que estão na lista original são os que estão na copia e alterar esses objectos provoca alteração nas duas listas.
Uma clonagem “profunda” pode ser feita clonando cada elemento e sunbsituindo assim

ArrayList novo = new ArrayList();

for (Iterator it = arrayListInicial.iterator();it.hasNext();){
         novo.add(((Cloneable)it.next()).clone());
}

O mesmo pode ser necessário para mapas e sets.

sergiotaborda

gomesrod:

Afinal, se é de uma classe pronta não há como implementar a interface e consequentemente usar o método clone(). Nesse caso, também gostaria de saber como fazê-lo…

Vc pode extender o ArrayList e sobreescrever o método clone. Só que o método irá retornar um objeto da nova classe.

class MyArrayList  extends ArrayList {
 
     public MyArrayList   (ArrayList   other){
           // clonagem em profunidade
     }

     public Object clone(){
          return new MyArrayList (this);
      }
}
furutani

Olá

Pode fazer cópias de objetos serializando eles.

gfronza

Sobre o que o furutani falou, cópia com serialização, tem artigo na Mundo Java deste mês! só adquiri-la :smiley:

Valeu!

sergiotaborda

furutani:
Olá
Pode fazer cópias de objetos serializando eles.

Isso é gabiarra fora que é muito menos eficiente que o clone normal
e claro, força que o objeto seja serializável o que em alguns casos pode não ser compativel com ser clonável. (por exemplo um objeto swing pode ser clonado mas não serializado)

Criado 17 de agosto de 2007
Ultima resposta 19 de ago. de 2007
Respostas 8
Participantes 6