Eu gostaria de saber como fazer um clone de um objeto. Fiz lgumas pesquisas e descobri que como o clone() é um método protected da classe Object ele deve ser sobrescrito. Tentei fazer o seguinte exemplo, mas infelizmente não deu certo. Será que alguem pode me ajudar?
public class Circulo{
private Point origem;
private double raio;
public Object clone() {
try {
Circulo c = super.clone();
c.origem = origem.clone(); // Point deve ser clonável!
return c;
} catch (CloneNotSupportedException e) {return null;}
}
}
Clone
W
2 Respostas
B
Você deve implementar o clone "manualmente" mesmo…
Criar um novo objeto e ir fazendo uma cópia dos atributos, e caso algum seja um outro objeto, fazer a cópia recursivamente também.
É o chamado "deep copy".
H
Só prá clarear. A cópia manual só é necessária se o clone for ´impuro´, e mesmo assim só dos membros que for desejado mudar. A chamada ao método clone() da classe Object através de super.close() faz todo o trabalho pesado. Observem os dois exemplos abaixo:
/**
* Versão da classe Teste que produz um clone ´puro´.
* @author hipersoft
<em>/
public class Teste implements Cloneable
{
int membro1;
String membro2;
/</em>*
* Construtor padrão.
<em>/
public Teste()
{
membro2 = "inicializado";
}
/</em>*
* Cria um clone puro do objeto.
* @return o clone
<em>/
public Object clone() throws CloneNotSupportedException
{
return super.clone();
}
/</em>*
* Teste de unidade.
<em>/
public static void main(String args []) throws CloneNotSupportedException
{
Teste teste_original = new Teste();
Teste teste_clonado = (Teste) teste_original.clone();
//
// dump do original
//
System.out.println(teste_original.membro1);
System.out.println(teste_original.membro2);
//
// dump do clone
//
System.out.println(teste_clonado.membro1);
System.out.println(teste_clonado.membro2);
}
}
/</em>*
* Versão da classe Teste que produz um clone ´impuro´.
* @author hipersoft
<em>/
public class Teste implements Cloneable
{
int membro1;
String membro2;
/</em>*
* Construtor padrão.
<em>/
public Teste()
{
membro2 = "inicializado";
}
/</em>*
* Cria um clone impuro do objeto.
* @return o clone
<em>/
public Object clone() throws CloneNotSupportedException
{
Teste copia = (Teste) super.clone();
copia.membro1 = 3;
copia.membro2 = "mudou valor";
returjn copia;
}
/</em>*
* Teste de unidade.
*/
public static void main(String args []) throws CloneNotSupportedException
{
Teste teste_original = new Teste();
Teste teste_clonado = (Teste) teste_original.clone();
//
// dump do original
//
System.out.println(teste_original.membro1);
System.out.println(teste_original.membro2);
//
// dump do clone
//
System.out.println(teste_clonado.membro1);
System.out.println(teste_clonado.membro2);
}
}
Criado 15 de janeiro de 2003
Ultima resposta 10 de mar. de 2003
Respostas 2
Participantes 3
Alura O que é Python? — um guia completo para iniciar nessa linguagem de programação Acesse agora o guia sobre Python e inicie sua jornada nessa linguagem de programação: o que é e para que serve, sua sintaxe e como iniciar nela!
Casa do Codigo Engenharia de Prompt para Devs: Um guia para aprender a... Por Ricardo Pupo Larguesa — Casa do Codigo