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