我知道什么是deep copy
, shallow copy
,how to deep copy
等等,但我的主要疑问是何时深度复制对象引用?或多久一次?
场景1:
考虑一个代码,完整代码请参见http://pastebin.com/WEgeBFNb
class Box{
Position pos;
Box(Position p){
pos = p;
}
Position getPosition(){
return pos;
}
}
和一个main()
喜欢:
public class Sample{
public static void main(String args[]){
Position pos = new Position(3,5);
Box box = new Box(pos);
pos.setX(5);
System.out.println( box.getPosition().getX());
// Will print 5, but I want Box to retain its value
}
我通过以下方式实现了上述要求:
Box(Position p){
pos = new Position(p); // Deep cloning
}
然后我也必须有一个复制构造函数Position
,比如:
Position(Position p){
x = p.x;
y = p.y;
}
但我的问题是:何时使用深度克隆?
场景 2: 例如,考虑 ac# 代码。
List<Accounts> = Mysession.getAllAccounts();
. 在这里,我希望返回对象的变化不能反映在会话对象中。(这种情况不仅在 C# 中,而且通常在任何oop
语言中)
所以,如果我开始深度克隆,那么,这不是一件容易的事,因为它会上升到 5 级更深的对象,具有 has-a 关系
再一次,我知道要获得准确的 100%,我必须进行深度克隆。同意。
- 更常见的是什么?返回引用或对象的副本?
- 我听说,深度克隆是一个繁琐的过程,必须避免。那么多久可以进行一次深度克隆?
- 您能否提供一些示例场景(不需要代码)。
- 虽然像上面的例子一样初始化,但
box
必须使用克隆pos = new Position(p)
?还是正常分配pos = p
?