2012-11-23 147 views
2

我想要做的就是定義一個拷貝構造函數 需要作爲一個參數,它初始化新的A是論爭的java的深拷貝

public class A<E extends Comparable<? super E>> implements B<E> 
{ 
    private A a; 
    private E[] hArray; 

    // What I tried .... my copy constructor 

    public A(A other) 
    { 
     this.a = other; // deep copy 
    } 
} 

的深 副本這是通過複製構造函數進行深層複製的正確方法嗎?

+0

只是爲了澄清,你想'this.a'是'其他'的深層副本,或者你想'this'是'other'的深層副本嗎? – Jason

+0

hm new A是參數A的深層副本。 – hibc

+0

好的,那我下面的答案仍然存在。 – Jason

回答

4

這不是一個深層複製。您只是存儲對其他對象的引用。

試試這個:

public A(A other) { 
    if(other.a != null) { 
     this.a = new A(other.a); 
    } 
    if(other.hArray != null) { 
     this.hArray = new E[other.hArray.length]; 
     for(int index = 0; index < other.hArray.length; index++) { 
      this.hArray[index] = other.hArray[index].clone(); 
     } 
    } 
} 

這假定E也具有執行深拷貝拷貝構造函數。另外我只注意到E是一個泛型,所以我的代碼可能無法正確工作(但想法在那裏)。

+0

非常感謝! – hibc

+0

是的,我認爲最好的辦法可能是把'E'實現'Cloneable'的限制放在可能的位置......然後你可以直接去this.hArray [index] = other.hArray [index] .clone() ;' - 但當然這並不保證深拷貝... – Jeff

+0

所有的Java數組都實現了一個公共'clone()',你可以用它來初始化'hArray'。 – millimoose

1

如果您想要深度複製,則不能僅指定深度複製的含義。你需要去:

public A(A other) 
{ 
    if(other != null) { 
     this.a = new A(other.a); // deep copy 
    } else { 
     this.a = null; 
    } 
} 

這是遞歸複製,你可以結束各種無限循環,但是。另外,您需要深入複製E,這些泛型讓人難以置信,所以我不會試圖推測您如何做到這一點。