2010-09-19 71 views
1

对我而言,问题在于为对象实现克隆。这个对象A的成员对象B不是由A创建的。我想克隆A,使得只有在构造A时创建的对象才能被克隆。这些对象或者作为A或A的对象中的引用传递,或者A的对象的对象不被克隆。他们应该只被引用。Java中的深度克隆 - 仅克隆正在构建的对象

这可能吗?我已经通过了一些深层克隆库源码(deep - cloner);他们似乎无法做出区分。我不能做序列化反序列化,因为我怀疑它不会解决我的情况。另外,我必须克隆的对象A非常复杂。我涉及项目中的几乎所有课程。 Apache系列化应用程序是否处理上述情况?

回答

2

这是不可能的。基本上,Java中没有任何东西可以让你确定何时给定的对象被创建。

如果对象A能够保存它在其构造函数中创建的成员对象的记录,那么您将能够获得此问题的唯一方法是。

1

您将需要手动实施A.clone(),以便它只克隆要克隆的对象。的Object.clone默认的实现是执行一个浅拷贝操作,所以你需要做这样的事情:

public class A implements Cloneable { 

    [...] 
    public Object clone() { 
     Object obj = null; 

     try { 
      obj = super.clone(); 
      // super.clone performs a "shallow copy" operation. 
      // Now you will need to manually clone any objects for 
      // which a "deep copy" operation is desired, e.g. 
      // 
      // obj.memberX = memberX.clone(); 
      // obj.memberY = memberY.clone(); 
      // ... 
      // 
     } catch (CloneNotSupportedException ex) { 
      // Should not happen.. 
     } 
     return obj; 
    } 
} 

这是假设你知道你想克隆出哪些对象(即哪些对象在那里建设的过程中产生)。