【问题标题】:shallow copy and deep copy example浅拷贝和深拷贝示例
【发布时间】:2012-04-13 18:05:23
【问题描述】:

我可以通过以下方式实现深拷贝和浅拷贝吗?正确吗? 以下 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();
 }

}

【问题讨论】:

    标签: java clone


    【解决方案1】:

    我建议您考虑使用copy constructors,而不是尝试实现Cloneable,即considered broken。复制构造函数将其声明类型的实例作为参数,并将该实例的字段复制到新对象。例如:

    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);
    }
    

    虽然您的问题并不清楚为什么需要深拷贝。


    为了进一步阅读,this article 涉及Cloneable 的问题和复制构造函数的限制。

    【讨论】:

    • 这是一个示例代码。在最终代码中,只有一个克隆方法存在。我现在在原始帖子中结束了这个
    • 我想在 java 中学习 abt clone。这就是我发布问题的原因。你能帮我克隆而不是复制构造函数
    • 你应该了解clone的是你永远不应该使用它。 +1。
    【解决方案2】:

    您还可以使用 dup() 方法,该方法还返回原始的副本,具体取决于您尝试使用复制方法实现的代码类型...您只是在寻求建议而没有向我们提供足够的信息正确地指导你......在stackoverflow中还有大量已回答的问题有示例,所以你应该先用你的东西检查它,然后再寻求额外的帮助

    【讨论】:

    • 但是经过思考我想出了自己的实现,所以想知道它是否正确
    【解决方案3】:

    根据我的理解,这是正确的,您只需确保一件事,即在 DepartMent 类中覆盖 clone() 方法。

    【讨论】:

      猜你喜欢
      • 2012-04-12
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多