2012-03-30 186 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()方法。