代码之家  ›  专栏  ›  技术社区  ›  Dimitri C.

深度复制操作是否递归地复制它不拥有的子变量?

  •  5
  • Dimitri C.  · 技术社区  · 16 年前

    给定一个对象有一个它不拥有的变量;也就是说,该变量由 aggregation 而不是 composition . 深度复制操作将复制变量还是只复制指向它的链接?

    2 回复  |  直到 14 年前
        1
  •  4
  •   Jeffrey L Whitledge    15 年前

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

    我要反驳另一个答案,说:不,一个对象不应该深入复制它不拥有的另一个对象。

    人们会期望一个对象的深度副本(至少在最初)与原始副本相同。如果一份深度复制品是由原作不拥有的参考资料制成的,那么这就留下了一个问题,即新复制品的所有者是谁。如果克隆拥有它,那么它将与原始对象不相同。它将是一个与原始对象类似的对象,除非它拥有对其聚合成员之一的引用。这肯定会导致混乱。如果克隆人不拥有它,那么谁拥有?

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

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

    我认为,正如您所建议的,深度复制只包含所拥有的对象是大多数情况下唯一明智的方法。

        2
  •  1
  •   Łukasz W.    16 年前

    将oposite中的deep copy复制到shallow中,应该递归地将整个对象复制到地面,并对对象和包含的所有对象进行全新的复制。

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