我知道什麼是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: 例如,考慮一個c#代碼。
List<Accounts> = Mysession.getAllAccounts();
。在這裏,我預計返回對象中的更改不能反映在會話對象中。 (這種情況不僅在C#中,而且通常在任何oop
語言中) 所以,如果我開始深度克隆,那麼這不是一件容易的事情,因爲它會上升到5個更深的對象,並且具有一個關係
再次,我知道得到確切的100%我必須深入克隆。同意。
- 什麼是比較常見的?返回參考或對象的副本?
- 我聽說,深度克隆是一個繁瑣的過程,必須避免。所以多久一次可以深入克隆?
- 您可以舉一些示例場景(代碼不需要)。
- 初始化像上面的
box
例子,必須使用克隆pos = new Position(p)
?或正常分配pos = p
?
如果您的值對象只包含System.ValueType作爲字段,您可以使用struct而不是class.so,那麼您可以簡單地使用pos = p而不是pos = new Position(p)。 – Frank59
@ Frank59考慮另一個具有其他對象的「has-a」關係的類。說'新房(myroom)''這裏'房間'包含一個'盒子'。在這種情況下,在'房間'構造函數中,我必須像'this.box = new Box(room.getBox());'[深層克隆]或簡單地'this.box = room.getBox()'[參考複製]? –
如果你使用的結構(框是結構)和ValueTypes(框字段是值類型和結構)只有你可以使用neBox = oldBox; (自動深度複製),但是如果您將Box作爲類或引用到Box字段中,則需要實施深度複製算法。閱讀更多http://msdn.microsoft.com/en-us/library/saxz13w4.aspx – Frank59