执行深层复制时,显然不应复制引用。但是,如果要复制的对象包含的对象本身是对同一对象的引用,则应该维护这些对象,还是应该复制数据。
实施例
public class Program() {
public void Main(String[] args) {
Person person = new Person();
person.setName("Simon");
List<Person> people = new ArrayList<Person>();
people.add(person);
people.add(person);
people.add(person);
List<Person> otherPeople = magicDeepCopyFunction(people);
otherPeople.get(0).setName("Adam");
// should this output 'Adam' or 'Simon'?
System.out.println(otherPeople.get(1));
}
}
我可以看到两者的论点,但我想知道共识是什么。
答案 0 :(得分:3)
真正的深层复制会在引用树的所有位置创建所有内容的副本。
如果B是A的深层副本,则您对A所做的任何更改都将通过B显示而不是。
大多数深层复制算法都不会注意到,在您的示例中,people
的所有三个成员都是对同一person
的引用。典型的深度复制算法会创建三个新的Person对象。
然而,看到真正的深层副本并不常见,因为它很难可靠地编程(除了非常严格定义的数据结构),并且在运行时很昂贵。
答案 1 :(得分:2)
这取决于您对数据结构如何工作的期望。
通常,您可以使引用与原始引用一样常见。也就是说它应该假设你有两个对同一个对象的引用是有充分理由的。您不应该期望它为同一个对象制作两个副本,以解决不正确的数据结构。
答案 2 :(得分:2)
+1 如果我看到了magicDeepCopyFunction()的调用,我会期待真正的深层复制。它更具防御性,更难实现,因为可能存在另一个级别的关系,周期等。这实际上取决于你想要做什么,但如果你调用方法深层复制,其他人可以将它用作黑盒子没有任何风险。