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

标签 language-agnostic terminology deep-copy

给定一个对象,它有一个不属于它的变量;即变量由aggregation组成而不是 composition .深度复制操作会复制变量还是只复制指向它的链接?

最佳答案

我喜欢你在这里对深拷贝上下文中组合和聚合的作用做出的区分。

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

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

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

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

我认为,正如您所建议的那样,仅包含自有对象的深层复制是大多数用途的唯一合理方法。

关于language-agnostic - 深度复制操作是否递归复制它不拥有的子变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3351096/

相关文章:

algorithm - 堆的排列算法

unit-testing - 对调用我已经在测试的另一种方法的方法进行单元测试是不好的做法吗?

c++ - 复制和赋值构造函数的问题

java - 通过序列化复制多维数组

arrays - 对描述多边形的线段数组进行排序和分组

language-agnostic - 我应该为将来的更改准备我的代码吗?

computer-science - 术语 'locally' 在软件中的确切含义是什么?

Javascript - 命名空间与闭包之间的区别?

programming-languages - 语句和关键字有什么区别?

python - 在 Python 中复制嵌套列表