当所拥有的变量为不可变类型时,浅复制就足够了。深度复制是可能的,但只会增加内存使用。
class Element{
}
class Example {
private List<Element> elementList = new ArrayList<Element();
public List<Element> getElementList() {
return new ArrayList<Element>(this.elementList);
}
public void addElement(Element e) {
elementList.add(e);
}
public void removeElement(Element e) {
elementList.remove(e);
}
}
Example.elementList
的修改都通过对象方法进行,但是你想要暴露存储在列表中的元素。因此,你创建了一个 getter 方法来返回一个浅拷贝。浅拷贝是因为你想要暴露列表中的对象,而不是它们的副本,但同时也是拷贝,因为你不希望调用者修改对象的列表。一个可能的使用情况是,当组合对象可以从浅拷贝中存在的状态信息派生出来,并且您希望序列化对象时。
您可以存储浅拷贝,然后在反序列化时从状态重建完整的对象。
从C++的角度来看,我会在实现写时复制机制时使用浅拷贝。
正如我在回答你相关问题时指出的那样,许多语言实际上没有浅复制和深复制的概念。然而,在C++中,这个类防止你使用空指针的情况可能是需要“浅”复制的一个例子:
template <typename T>
struct NotNull {
T * p;
NotNull( T * t ) : p( t ) {}
T & operator *() {
if ( ! p ) {
throw "null!";
}
return * p;
}
};
浅复制速度更快,这通常是很有吸引力的显而易见的原因。浅复制的最终目的显然就是原始对象的引用拷贝。如果你不需要改变一个对象并且可以保证在处理对象时它不会被其他方式修改,那么复制的越浅,越好。