2013-05-29 4 views
2

J'ai une classe Calle avec un String nombre; et un int addr;. Mais, la méthode clone que j'ai faite me donne les mauvaises valeurs.Vous recherchez la bonne façon de cloner

public class Calle{ 
    String nombre; 
    int addr; 

    public Object clone(){ 
     return this; 
    } 
} 

Calle c1 = new Calle("a",1); 
Calle c2 = c1.clone(); 
c2.setAddr(3); 

System.out.println(c1.addr); // value wrong 

Pourquoi la valeur est-elle incorrecte?

+1

b/c vous n'êtes pas en fait le clonage. vous devez réellement créer un nouvel objet et le renvoyer – greedybuddha

+0

Le clonage n'est pas une méthode spéciale, c'est comme n'importe quelle autre méthode en ce qui concerne Java. Vous devez le coder pour cloner réellement l'objet, pas seulement 'return this'. – Patashu

Répondre

2

Pour votre cas, vous pouvez utiliser la méthode de clone superficielle standard fournie par Object. Tant que String est immuable et que la valeur int sera copiée, il n'y a aucune raison de surcharger la logique de copie. Juste le rendre visible.

public Object clone(){ 
    return super.clone(); 
} 

Cloneable L'interface devrait également être implémentée.

+0

clone standard de copier toutes les valeurs? – leftsync

+0

Oui, il fait une copie superficielle. Sans copier les objets enfants. – Mikhail

+0

http://en.wikipedia.org/wiki/Clone_(Java_method) – Mikhail

3

Votre méthode clone est erroné parce qu'il est pas vraiment quoi que ce soit le clonage, il est juste de retourner le même objet. Le clone devrait toujours être un nouvel objet avec les mêmes valeurs que l'original.

Dans ce cas, il semble que vous ayez déjà un constructeur de copie, il suffit donc de l'utiliser pour créer le nouveau Calle et le renvoyer.

public Object clone(){ 
    return new Calle(this.nombre, this.addr); 
} 
+0

que tout cela change? – leftsync

+0

C'est tout. Cela va créer la nouvelle rue, remplir les mêmes valeurs que l'objet que vous le clonage, et le retourner – greedybuddha

1

Votre méthode clone est erroné parce qu'il est pas vraiment quoi que ce soit le clonage, il est juste de retourner le même objet.

public Object clone() throws CloneNotSupportedException{ 
    return super.clone(); 
} 

Ce clonage ne le fera que le clonage superficiel .Si vous voulez le clonage profond, vous devez écrire votre logique gagné à cloner.

Questions connexes