Membro desde: 10/10/2002 00:00:00
Mensagens: 3
Offline
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?
<BR>
<BR>
<BR>public class Circulo{
<BR> private Point origem;
<BR> private double raio;
<BR> public Object clone() {
<BR> try {
<BR> Circulo c = super.clone();
<BR> c.origem = origem.clone(); // Point deve ser clonável!
<BR> return c;
<BR> } catch (CloneNotSupportedException e) {return null;}
<BR> }
<BR>}
Membro desde: 07/09/2002 00:00:00
Mensagens: 235
Offline
Você deve implementar o clone "manualmente" mesmo...
<BR>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.
<BR>É o chamado "deep copy".
Membro desde: 07/03/2003 00:00:00
Mensagens: 369
Offline
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:
<BR>
<BR>/**
<BR> * Versão da classe Teste que produz um clone ´puro´.
<BR> * @author hipersoft
<BR> */
<BR>public class Teste implements Cloneable
<BR>{
<BR> int membro1;
<BR> String membro2;
<BR>
<BR> /**
<BR> * Construtor padrão.
<BR> */
<BR> public Teste()
<BR> {
<BR> membro2 = "inicializado";
<BR> }
<BR>
<BR> /**
<BR> * Cria um clone puro do objeto.
<BR> * @return o clone
<BR> */
<BR> public Object clone() throws CloneNotSupportedException
<BR> {
<BR> return super.clone();
<BR> }
<BR>
<BR> /**
<BR> * Teste de unidade.
<BR> */
<BR> public static void main(String args []) throws CloneNotSupportedException
<BR> {
<BR> Teste teste_original = new Teste();
<BR> Teste teste_clonado = (Teste) teste_original.clone();
<BR> //
<BR> // dump do original
<BR> //
<BR> System.out.println(teste_original.membro1);
<BR> System.out.println(teste_original.membro2);
<BR> //
<BR> // dump do clone
<BR> //
<BR> System.out.println(teste_clonado.membro1);
<BR> System.out.println(teste_clonado.membro2);
<BR> }
<BR>}
<BR>
<BR>/**
<BR> * Versão da classe Teste que produz um clone ´impuro´.
<BR> * @author hipersoft
<BR> */
<BR>public class Teste implements Cloneable
<BR>{
<BR> int membro1;
<BR> String membro2;
<BR>
<BR> /**
<BR> * Construtor padrão.
<BR> */
<BR> public Teste()
<BR> {
<BR> membro2 = "inicializado";
<BR> }
<BR>
<BR> /**
<BR> * Cria um clone impuro do objeto.
<BR> * @return o clone
<BR> */
<BR> public Object clone() throws CloneNotSupportedException
<BR> {
<BR> Teste copia = (Teste) super.clone();
<BR> copia.membro1 = 3;
<BR> copia.membro2 = "mudou valor";
<BR> returjn copia;
<BR> }
<BR>
<BR> /**
<BR> * Teste de unidade.
<BR> */
<BR> public static void main(String args []) throws CloneNotSupportedException
<BR> {
<BR> Teste teste_original = new Teste();
<BR> Teste teste_clonado = (Teste) teste_original.clone();
<BR> //
<BR> // dump do original
<BR> //
<BR> System.out.println(teste_original.membro1);
<BR> System.out.println(teste_original.membro2);
<BR> //
<BR> // dump do clone
<BR> //
<BR> System.out.println(teste_clonado.membro1);
<BR> System.out.println(teste_clonado.membro2);
<BR> }
<BR>}
<BR>