我喜欢您在深层复制的上下文中对组合和聚合的作用进行的区分。
我要反对另一个答案并说:不,一个对象不应该深度复制它不拥有的另一个对象。
人们期望对象的深层副本(至少在最初)与原始对象相同。如果深层副本是由原始副本不拥有的引用构成的,那么这就留下了新副本拥有者的问题。如果克隆拥有它,那么它就不会与原始对象相同。它将是一个与原始对象类似的对象,只不过它拥有对其聚合成员之一的引用。这肯定会导致混乱。如果克隆人不拥有它,那么谁拥有它?
这种所有权问题在非垃圾收集语言中尤其重要,但即使使用垃圾收集器也会产生问题。例如,如果克隆允许对某个对象进行未提交的更改,那么是否允许对其引用的另一个对象进行更改?如果不允许更改,则没有理由对其进行深度复制。如果允许更改,那么如何提交这些更改,因为正在修改的对象不控制此引用的对象?当然,可以为此设计一种机制,但这肯定意味着克隆对象超出了其职责,并且该程序将成为维护噩梦。
包含无主对象的深层复制操作也会导致无限(或至少过多)复制操作的问题。假设一个对象是集合的一部分,并进一步假设该对象需要对该集合的引用。然后,对该对象进行简单的深度复制操作将创建该集合及其每个成员的新副本。即使假设我们避免了无限递归的问题,并保持这组新对象中的所有引用一致,对于大多数目的来说仍然是过度的,并且对于需要新集合的情况,这不是更有意义吗?为此目的,深度复制集合本身,而不是其成员之一?
我认为,正如您所建议的,仅包含拥有的对象的深层复制是对于大多数目的来说唯一明智的方法。