5

给定一个对象,它有一个它不拥有的变量;也就是说,变量是通过聚合而不是组合来组合的。深度复制操作会复制变量还是仅复制指向它的链接?

4

2 回答 2

4

我喜欢您在这里对深层复制上下文中的组合角色和聚合角色所做的区分。

我将反对另一个答案并说:不,一个对象不应该深度复制它不拥有的另一个对象。

人们会期望对象的深层副本(至少最初)与原始对象相同。如果深层副本是由原始副本不拥有的引用制成的,那么这就留下了新副本拥有什么的问题。如果克隆拥有它,那么它将与原始对象不同。它将是一个与原始对象类似的对象,只是它拥有对其聚合成员之一的引用。这肯定会导致混乱。如果克隆不拥有它,那么谁拥有它?

这个所有权问题在非垃圾收集语言中尤为重要,但即使是垃圾收集器也会产生问题。例如,如果克隆允许对一个对象进行未提交的更改,是否允许对它引用的另一个对象进行更改?如果不允许更改,则没有理由对其进行深度复制。如果允许更改,那么如何提交这些更改,因为被修改的对象不控制这个引用的对象?当然,可以为此设计一种机制,但这意味着克隆对象超出了其职责范围,并且程序将成为维护的噩梦。

包含无主对象的深度复制操作也会导致无限(或至少过度)复制操作的问题。假设一个对象是集合的一部分,并进一步假设该对象需要对该集合的引用。然后对该对象进行简单的深拷贝操作将创建集合及其每个成员的新副本。即使假设我们避免了无限递归的问题,并且在这组新对象之间保持所有引用一致,但对于大多数目的来说仍然是多余的,对于那些需要新集合的情况,这不是更有意义吗为此目的,深度复制集合本身,而不是其中一个成员?

正如您所建议的,我认为仅包含拥有对象的深层副本是大多数用途的唯一明智的方法。

于 2010-08-26T19:12:25.950 回答
1

与浅层相反的深层复制应该将整个对象递归地复制到地面,并对对象和所有包含的对象进行全新的复制。

所以是的,它应该复制变量,而不仅仅是链接..

于 2010-07-28T08:29:36.953 回答