Como eu crio uma cópia de um objeto?

o metodo clone so serve para arraylists…

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); } }

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!

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…

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.

[quote=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…[/quote]

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);
      }
}

Olá

Pode fazer cópias de objetos serializando eles.

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

Valeu!

[quote=furutani]Olá
Pode fazer cópias de objetos serializando eles.
[/quote]

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)