Java:深入克隆一个复杂的" has-a"类层次结构

时间:2014-05-15 22:47:53

标签: java copy-constructor

我们说我有以下课程:

public class MyClass1{

   MyClass2 obj1;
   MyClass3 obj2;

}

public class MyClass2{

   MyClass4 obj;//May or may not be referencing the same MyClass4 object in MyClass3.

}

public class MyClass3{

   MyClass4 obj;//May or may not be referencing the same MyClass4 object in MyClass2.

}

如何为MyClass1创建一个复制构造函数,它将保留整个层次结构,即使MyClass2和MyClass3中的对象引用同一个对象也是如此。如果上面的例子是我必须完成的工作,我可以做类似的事情:

public MyClass1(MyClass1 mc1){
   if(mc1.obj1.obj == mc1.obj2.obj)
      ...
      ...
   else
      ...
      ...
}

但我最终会尝试复制一个包含十几个节点,几十个边缘和几个链接列表的图表,每个链接列表都有多个指向列表中各个节点的指针(可能指向也可能不指向同一节点)。鉴于我的图表有多大和相互关联,我怀疑我可以使上述if-else结构工作。

提前致谢。

2 个答案:

答案 0 :(得分:0)

你可以在每个对象中都有一个标志,指示对象是否被访问过。这可能会对您有所帮助:http://java.dzone.com/articles/design-patterns-visitor

答案 1 :(得分:0)

深度复制对象图的一种方法是使用序列化 - 反序列化

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(topClass);

ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream in = new ObjectInputStream(bis);
MyClass1 copy = (MyClass1) in.readObject();

为此,所有类必须实现Serializable。序列化机制确保如果两个引用引用原始中的相同实例,它们也将引用新实例中的相同(新)实例。

缺点是:

  1. 他们必须实现Serializable
  2. 它们都必须包含在一个对象中。如果两个对象直接或间接引用同一个实例,那么分别深度复制这两个对象的结果将产生两个独立的引用对象实例。