Clone

2 respostas
W
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;}


   }


}

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
 prá clarear. A cópia manual  é necessária se o clone for ´impuro´, e mesmo assim  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