【发布时间】:2015-09-08 04:37:51
【问题描述】:
我目前正在为 Java 开发一个图形库。如您所料,存在一个Vertex 类。该类包含一个类型为VertexData<T> 的对象,它本身可以包含任何东西。
(我知道这可能是多余的,我可以做Vertex<T>,但就问题而言,这并不重要)。
我让VertexData<T> 实现Cloneable 并有一个public VertexData<T> clone() 方法通过对调用Object 进行序列化和反序列化来返回深层副本,与here 描述的非常相似
现在的问题是,既然我有一个深拷贝方法,那么也有一个浅拷贝有意义吗?如果是这样,在什么情况下浅拷贝比深拷贝更受欢迎?
更新:由于大多数答案和 cmets 都以某种方式解释了浅拷贝是什么,我觉得我必须澄清一下。我确实知道什么是浅拷贝,它是如何工作的,一切。我的问题是,既然我正在开发一个库,而且我已经创建了一个深拷贝方法,那么也提供一种浅拷贝方法是否有意义?
我还要在这里补充一点,VertexData<T> 类中不包含原始类型。
那么在用于存储图库的顶点数据的容器类的上下文中,是否需要浅拷贝?
如果是这样,您能在我正在开发的背景下想一个例子吗?
如果不是为了完整性,我应该添加浅拷贝方法吗?
这是一个好的做法还是没关系?
【问题讨论】:
-
当您想要复制共享一个大型底层数据结构或一组数据的类时,浅拷贝很有用。例如,如果您有几个“客户端”类都引用了大型数据结构引用,如果您想要复制客户端,深度复制将尝试复制基础数据,这不一定是你想要的。
-
视情况而定。浅拷贝一般是指只拷贝一个对象的一个层次,而深拷贝一般是指在多个层次上拷贝所有东西。
-
如果您引用不可变对象,通常会创建浅拷贝,但这只是一个示例,而不是规则。