2016-04-14 47 views
2

我在我的拷貝構造函數的java的clone()與數組

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

想這一點,但feitico具有相同的參考而非陣列

在克隆的對象我真的需要克隆的每一個元素在數組中,還是我的克隆()爲拼寫錯誤?

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

那麼clone()方法只對數組基元?有用,因爲我通過array.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[]

this.feitico = Arrays.stream(rValue.feitico).map(Spell::new).toArray(Spell[]::new); 

在Java 7和下方,用自己的方式不能得到改善。