2017-12-29 13 views
0

Ich habe eine geklonte Referenz eines Objekts im flachen Klonen mit Java erstellt. Aber wenn ich das Objekt aktualisiere, wird die im referenzierten Klon gespeicherte Zeichenfolge nicht aktualisiert. Warum? Die Basisklasse ist,Was tun, wenn der Klon nicht aktualisiert wird, wenn das ursprüngliche Objekt geändert wird, während ein seichter Klonprozess in Java verwendet wird

public class Base { 
String name; 
int price; 


public Base(String a, int b) { 
    name = a; 
    price = b; 
    System.out.println("The " + name + " is " + price + " rupees."); 
} 

public Base(Base ref) { 
    this.name = ref.name; 
    this.price = ref.price; 
}} 

Die Klasse mit Hauptmethode ist,

public class ShallowCloning { 
String name; 
int price; 
Base ref; 

public ShallowCloning(String a, int b, Base c) { 
    name = a; 
    price = b; 
    ref = c; 
} 

public ShallowCloning (ShallowCloning once) { 
    this.name = once.name; 
    this.price = once.price; 
    this.ref = once.ref; 
    System.out.println("The " + name + " is " + price + " rupees."); 
} 

public static void main(String args[]) { 
    Base pet = new Base("fennec fox", 8000); 
    ShallowCloning obj = new ShallowCloning("Sugar glider", 5000, pet); 
    ShallowCloning clone = new ShallowCloning(obj); 
    System.out.println(obj.name); 
    obj.name = "Dog"; 
    System.out.println(obj.name); 
    System.out.println(clone.name); //Still getting the previously assigned string. 
    System.out.println(obj.ref); 
    System.out.println(clone.ref); 
}} 

Gibt es eine Möglichkeit meinen Code zu verändern, um Werte in diesem Prozess aktualisiert werden?

+0

Der Klon ist nicht das gleiche Objekt mehr. Wenn Sie wollen, dass "clone" mit "obj" identisch ist, verwenden Sie einfach "clone = object;". –

+0

Ich glaube, Sie missverstehen den Zweck des Klonens (nämlich: Erstellen eines ** neuen **, aber identische Instanz eines Objekts). Wenn Sie möchten, dass sich alle Änderungen auch auf das andere Objekt auswirken, ist das Klonen nicht der richtige Weg. –

+0

Wenn ich Code als, ShallowCloning clone = obj; Ich kann immer noch die Änderungen in beiden Objekten widerspiegeln. –

Antwort

-1

Verwendung Prototype Design Muster

Beispiel:

Clone Schnittstelle

public interface Clone { 
     public Clone getClone(); 
    } 

Base Class

public class Base implements Clone { 
     String name; 
     int price; 

     public Base(String a, int b) { 
      name = a; 
      price = b; 
      System.out.println("The " + name + " is " + price + " rupees."); 
     } 

     public Base(Base ref) { 
      this.name = ref.name; 
      this.price = ref.price; 
     } 

     @Override 
     public Clone getClone() { 
      return this; 
     } 
    } 

Testing

public class PrototypeTest { 

    public static void main(String[] args) { 
     Base base = new Base("Anant", 1); 

     Base clone = (Base) base.getClone(); 

     System.out.println("base name : " + base.name); 
     System.out.println("clone name : " + clone.name); 

     System.out.println("--------------MODIFY----------------"); 
     base.name = "Kedar"; 
     System.out.println("base name : " + base.name); 
     System.out.println("clone name : " + clone.name); 

    } 
} 

Ausgabe

The Anant is 1 rupees. 
    base name : Anant 
    clone name : Anant 
    --------------MODIFY---------------- 
    base name : Kedar 
    clone name : Kedar 
+0

Ist es nützlich? @Pon Samuel –

+0

Ja, vielen Dank @Anant Goswami, ich weiß jetzt, wie das Klonen passiert. –

+0

@PonSamuel Sie sind willkommen –

Verwandte Themen