真的需要浅拷贝吗?

qbi*_*bit 8 java generics deep-copy

我目前正在研究Java的图形库.如你所料,有一个Vertex班级.该类包含一个类型的对象,VertexData<T>它本身可以包含任何东西.
(我知道这可能是多余的,我可以这样做,Vertex<T>但为了问题的目的,这无关紧要).
我制作了一个VertexData<T>实现,Cloneable并有一个public VertexData<T> clone() 方法通过序列化和反序列化调用返回深层副本,Object就像这里描述的那样

现在问题是,因为我确实有一个深度复制方法,所以有一个浅拷贝是否有意义?如果是这样的话,那么浅拷贝比深拷贝更受欢迎的情况是什么?

更新:由于大多数答案和评论都包含对浅层副本的某种解释,我觉得我必须澄清一点.我知道浅色副本是什么,它是如何工作的,一切.我的问题是,因为它是我正在开发的,并且因为我确实创建了一个深度复制方法,所以为浅层复制提供方法是否有意义?

我也在这里添加,VertexData<T>类中没有原始类型.
因此,在用于存储图库的 Vertex数据的容器类的上下文中,是否需要浅层复制?
如果是这样,你能想到一个例子,在我正在开发的范围内吗?
如果不是我应该只为了完整性添加浅拷贝方法?
这是一个好习惯还是没关系?

sup*_*cat 3

像这样的容器类型List<Point>在某些情况下可用于保存一堆 X,Y 坐标对,但在其他情况下可用于标识由其他代码使用的一堆可移动点。前一种情况可以细分为子情况,其中 的所有者List<Point>也是其中实例的独占所有者Point,并且可以随意修改它们,或者所有者永远不会修改这些实例,但可以与承诺不修改这些实例的代码共享对它们的引用。修改它们。

如果List<Point>被用来封装 (X,Y) 坐标对,但所有者可能会修改Point其中保存的对象,那么 的正确克隆必须保存对所讨论对象List<Point>的副本的引用。Point如果它封装了坐标对,但没有人会修改其中的对象(并且克隆列表的接收者不会向任何可能修改它们的代码公开对其中对象的引用),那么 的正确克隆可以保存List<Point>对原始Point物品或其复制品;前者会更快,但后者在语义上仍然是正确的。

如果List<Point>用于标识 Point可能被其他代码修改的实例,并且任何此类修改都需要反映在其List<Point>自身中,那么正确的克隆必须Point保存对与原始列表相同的对象的引用。如果克隆要保存这些Point对象的副本,那么它将不再保存与原始列表相同的语义信息。

如果Java根据集合类型是使用独占的可变实例还是可共享的不可变实例来封装值,或者它们是否用于识别其中的事物来隔离集合类型,那么就有可能有一个“克隆”的单一概念,而不是要求“深”和“浅”克隆。然而,如果集合类型之间没有这样的区别,就需要有克隆方法来根据集合中的内容执行所需的任何操作。