2012-03-30 312 views
2

我可以用以下方式實現深拷貝和淺拷貝嗎?它是正確的嗎? 以下2種克隆方法中的任何一個將被放在最後的代碼淺拷貝和深拷貝示例

public class Student{ 
    private String name; 
    private DepartMent dept; 


//deep copy 
public Object clone() throws CloneNotSupportedException{ 
    Student s = (Student)super.clone(); 
    s.septDept((Department)dept.clone()); 
} 

//shallow copy 
public Object clone() throws CloneNotSupportedException{ 
    return super.clone(); 
} 

} 

回答

6

而是試圖實現Cloneable,這是considered broken的,我建議你看一下使用copy constructors。複製構造函數將其自己的聲明類型的實例作爲參數,並將該實例的字段複製到新對象。例如:

public Student(Student copyFrom) { 
    this.name = copyFrom.name; 
    this.dept = copyFrom.dept; 
} 

... 

Student copy = new Student(originalStudent); 

如果Department也暴露出一個拷貝構造函數,這將讓你做出的Student深層副本。例如:

public Student(Student copyFrom) { 
    this.name = copyFrom.name; 
    this.dept = new Department(copyFrom.dept); 
} 

雖然目前還不清楚您的問題爲什麼需要進行深層複製。


對於進一步閱讀,對Cloneable兩個問題和拷貝構造函數的侷限性this article接觸。

+0

這是一個示例代碼。在最終代碼中只有一個克隆方法將被presnt.I在原始帖子中結束了這個 – user93796 2012-03-30 03:13:34

+0

我想在java中學習abt clone。所以這就是爲什麼我發佈了這個問題。可以幫助我克隆而不是複製構造器 – user93796 2012-03-30 03:14:56

+4

你應該瞭解'克隆'的一點是你永遠不應該使用它。 +1。 – 2012-03-30 03:19:23

0

您也可以使用dup()方法返回原始副本,取決於您嘗試使用複製方法實現的代碼類型......您只是在沒有提供足夠信息的情況下徵求建議指導你正確...在stackoverflow中也有噸的答案有例子,所以你應該先檢查它與你的東西,然後再問一個幫助

+0

但想到我想出了我自己的實現,所以想知道它的正確性 – user93796 2012-03-30 03:18:06

0

根據我的理解,這是正確的,只有一件事你必須確保在DepartMent類中也重寫clone()方法。