2017-12-29 28 views
0

Javaを使用して浅いクローニングでオブジェクトの複製参照を作成しました。しかし、オブジェクトを更新すると、参照されたクローンに格納されている文字列は更新されません。どうして? 基底クラスは、mainメソッドを持つJavaで浅いクローニングプロセスを使用しているときに元のオブジェクトが変更されたときにクローンが更新されない場合の対処方法

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; 
}} 

クラスは

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); 
}} 

は、このプロセスで値を更新し得るために、私のコードを変更する方法はあり、あるのですか?

+0

クローンはこれ以上同じオブジェクトではありません。 'clone'を' obj'と同じにするには 'clone = object;'を使います。 –

+0

私はあなたがクローニングの目的を誤解していると思います(すなわち:**新しい**しかし同じオブジェクトのインスタンスを作成する)。すべての変更が他のオブジェクトにも反映されるようにするには、クローニングは不可欠です。 –

+0

私は、ShallowCloningとしてコードする場合クローン= obj;私はまだ両方のオブジェクトで発生した変更を反映することができます。 –

答えて

-1

使用プロトタイプデザインパターン

例:

クローンインタフェース

public interface Clone { 
     public Clone getClone(); 
    } 

基本クラス

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; 
     } 
    } 

テスト

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); 

    } 
} 

出力

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

それは役に立ちますか? @Pon Samuel –

+0

はい、ありがとう@Anant Goswami、私は今どのようにクローニングが起こるか知っています。 –

+0

@PonSamuelあなたはようこそ –

関連する問題