2010-04-25 7 views
4

Je sais déjà, ce qu'est une copie superficielle, mais je ne suis pas capable de l'implémenter. Voici un petit exemple.Copie superficielle en Java

public class Shallow { 
String name; 
int number; 

public Shallow (Shallow s) { 
    this.name = s.name; 
    this.number = s.number; 
} 
} 

Testez la mise en œuvre ...

public class ShallowTest { 
public static void main (String[] args) { 
    Shallow shallow = new Shallow("Shallow", 123); 
Shallow shallowClone = new Shallow(shallow); 
    shallowClone.name = 'Peter'; 
    shallowClone.number = 321; 
    System.out.println(shallow.name + " - " + shallow.number); 
} 
} 

Comme je l'ai vue, juste la référence de la chaîne de type de données non primitive serait copié, de sorte qu'en appelant « shallowClone.name = 'Peter'; " Je voudrais aussi changer le nom de "shallow". Ai-je raison? Mais de toute façon, il ne veut tout simplement pas travailler ....

+0

A quoi ressemble le nouveau code du constructeur Shallow (shallow) '? Vous ne l'avez pas inclus dans la question alors que le problème est probablement causé là. Noté devrait également être que les chaînes sont immuables. – BalusC

+0

Juste édité le constructeur. En outre: J'aime vraiment juste copier la référence des objets - c'est le but;) – Vilius

Répondre

5

Les chaînes et les entiers sont immuables. Réviser votre structure de données pour utiliser une structure mutable qui contient des références, telles qu'un tableau ou une collection. Par exemple.

public class Shallow { 
    private Object[] properties = new Object[2]; 

    public Shallow(String name, int number) { 
     this.properties[0] = name; 
     this.properties[1] = number; 
    } 

    public Shallow(Shallow s) { 
     this.properties = s.properties; 
    } 

    public String getName() { 
     return (String) properties[0]; 
    } 

    public void setName(String name) { 
     this.properties[0] = name; 
    } 

    public int getNumber() { 
     return (Integer) properties[1]; 
    } 

    public void setNumber(int number) { 
     this.properties[1] = number; 
    } 
} 

Et d'utiliser getters/setters au lieu d'accéder directement aux propriétés.

Shallow shallow = new Shallow("Shallow", 123); 
Shallow shallowClone = new Shallow(shallow); 
shallowClone.setName("Peter"); 
shallowClone.setNumber(321); 
System.out.println(shallow.getName() + " - " + shallow.getNumber()); // Peter - 321 

Notez également que les chaînes doivent généralement être citées par des doubles quotes. Dans l'avenir, s'il vous plaît copypaste le code réel, compilable et de travail de votre éditeur au lieu de taper dessus ou de haut de la tête. Évitez les harengs rouges.

+0

Eh bien, d'accord. Je pense que je l'ai! Merci beaucoup :) – Vilius

+0

De rien. – BalusC

Questions connexes