【问题标题】:Deep clone an object in java [duplicate]在java中深度克隆一个对象[重复]
【发布时间】:2012-06-26 14:53:58
【问题描述】:

可能重复:
Java: recommended solution for deep cloning/copying an instance

我有一个必须克隆的对象。但是,在克隆时,它还应该克隆其中的对象。这怎么可能??

【问题讨论】:

    标签: java


    【解决方案1】:

    您需要像这样覆盖clone() 方法

    public class Person implements Cloneable{
     private Long id;
     private Address address
    
      @Override
      protected Object clone() throws CloneNotSupportedException {
      //do deep cloning
      }
    
     }
    

    另见

    【讨论】:

    • 最好将 OP 指向一个讨论正确实现 clone 的所有陷阱和陷阱的页面 :) 例如,永远不要使用 new 创建克隆,而是使用 super.clone
    • @Jigar 我想你说的是浅克隆而不是深克隆
    • @PramodKumar clone 机制本身既不深也不浅。这取决于你如何实现它。
    【解决方案2】:

    另一种克隆方式是提供复制构造函数,根据提供的实例的数据构造一个新的实例:

    public MyClass(MyClass instanceToCopy)
    {
       ...
    }
    

    【讨论】:

      【解决方案3】:

      Java 深度克隆库 克隆库是一个小型的开源库 深度克隆对象的java库。对象 不必实现 Cloneable 接口。实际上,这 库可以克隆任何 java 对象。

      Cloner cloner = new Cloner();
      MyClass clone = cloner.deepClone(o);
      

      所以这里是示例cloning

      【讨论】:

        【解决方案4】:

        最简单的深度克隆方法是使用Java serialization,其中serializedeserialize 对象并返回反序列化版本。

        【讨论】:

        • 这样做的缺点当然是类和它所指的一切都必须是Serializable
        【解决方案5】:

        实现深拷贝的最简单方法是序列化然后反序列化对象。查找ObjectInputStreamObjectOutputStream

        【讨论】:

          【解决方案6】:

          您必须意识到,这不是一个明确定义的问题,深度复制无法以机械化、全自动的方式正确完成。以下是一些选项:

          • Java 有 clone 协议,但现在大多数情况下它已被弃用;
          • 您可以使用序列化在内存中进行序列化-反序列化;
          • 您可以编写所谓的复制构造函数。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-10-11
            • 2013-06-29
            • 1970-01-01
            • 2017-02-23
            • 2010-09-09
            • 2016-12-20
            相关资源
            最近更新 更多