我们说我有以下课程:
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结构工作。
提前致谢。
答案 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。序列化机制确保如果两个引用引用原始中的相同实例,它们也将引用新实例中的相同(新)实例。
缺点是: