2016-04-14 6 views
2

と私は私のコピーコンストラクタJavaのクローン()配列

protected int forca; 
protected Spell []feitico; 
public Picareta(final Picareta rValue) 
    { 
     super((Ferramenta)rValue); 
     this.forca=rValue.forca; 
     this.feitico=rValue.feitico.clone(); 
    } 

でこれをしようとしてではなく、配列

内のオブジェクトを複製するのと同じ参照をfeitico持っています私は本当にすべての要素のクローンを作成する必要があります配列内にあるか、またはSpellの私のクローン()が間違っていますか?

public Spell clone() throws CloneNotSupportedException 
    { 
     super.clone(); 
     Spell temp= new Spell(this); 
     return temp; 
    } 

またはこれは最良の(コンパクトな)方法ですか?

public Picareta(final Picareta rValue) 
    { 
     super((Ferramenta)rValue); 
     this.forca=rValue.forca; 
     this.feitico=new Spell[rValue.feitico.length]; 
     for (int i=0;i<rValue.feitico.length;i++) 
      this.feitico[i]=new Spell(rValue.feitico[i]); 
    } 
+3

はい、実際には配列内のすべての要素をコピーする必要があります。 –

+0

次に、array.clone()は、本体またはコピーコンストラクタ内でも自分のclone()メソッドを使用するはずですが、clone()メソッドは配列プリミティブとしてのみ有効です。 –

+0

かなりそうです。 'clone()'はまったく役に立ちます。 (一般的に、ベストプラクティスはほとんどすべてを不変にすることですが、その場合はコピーする必要はありません。) –

答えて

1

配列オブジェクトのメソッド.clone()は配列をクローンします。これは他のオブジェクト、つまり配列内の要素によって参照されるオブジェクトを複製しません。

お問い合わせ内容は"deep copy" or "deep clone"です。新しいオブジェクトを保持するために、新しい配列を作成したら、あなたは古い配列を反復処理し、各オブジェクトのクローンを作成する必要があり参照:参照型の配列のための

this.feitico = new Spell[rValue.feitico.length]; 
for (int i = 0; i < this.feitico.length ; i += 1) 
    { 
    this.feitico[i] = rValue.feitico[i].clone(); 
    } 
1

cloneので、唯一の浅いコピーでありますはい、配列内のすべての要素をコピーする必要があります。

Spellのコピーコンストラクタは既に用意されています。これはあまり難しくありません。 Javaの8を使用して

は、Spell[]をコピーする良い方法があります:

以下のJava 7とで
this.feitico = Arrays.stream(rValue.feitico).map(Spell::new).toArray(Spell[]::new); 

、あなたの方法を向上させることができません。