“假设您正在向一个方法传递或返回一个对可变对象的引用数组。是否可以安全地制作一个引用副本?是否可以安全地制作一个浅拷贝?”
这是给我班级的一个研究问题,答案是“两者都不安全。在这种情况下,只有深层复制是安全的。”
为什么会这样?
答案 0 :(得分:2)
“安全”可能意味着很多事情,但在您的特定上下文中,它是关于“您的”私有数据的安全性(文本将“您”称为某些Java类的编写者)。如果您允许班级客户端访问并修改它,您的私人数据将无法安全。
因此:
如果返回一组可变对象,则必须复制所有这些对象并将它们以新数组的形式返回;
如果你传入了一系列可变对象,你必须再次复制它们并将它们放入一个新数组中 - 因为你的客户端已经引用了他传入的对象。
在实践中,所有这些都是很多CPU工作并占用内存,所以很少这样做。你要么设计一切都是不可变的 - 否则就会遇到可变对象固有的危险。
答案 1 :(得分:1)
如果您的对象是可变的,则意味着任何引用它们的客户端都可以修改它们。这可能导致竞争条件,死锁和其他无趣的行为。但是,如果在使用对象之前对其进行了深层复制,则可以有效地处理对象的快照。这确保没有其他客户端能够修改它们,从而消除了任何并发或正确性问题。
答案 2 :(得分:1)
在第一种情况下,可以修改原始数组元素和对象。在第二种情况下,只能修改对象,因为我们不再能够访问原始数组。如果你执行深层复制,我们正在使用完全不同的数组和对象,所以当然它是安全的。