2014-02-13 67 views

回答

11

在Java中使用clone()是棘手且值得懷疑的1,2。實際上,clone()是一個拷貝構造函數,對此,Dart List,MapSet類型每個都有一個名爲.from()named constructor執行shallow copy;例如考慮到這些聲明

Map<String, int> numMoons, moreMoons; 
    numMoons = const <String,int>{ 'Mars' : 2, 'Jupiter' : 27 }; 
    List<String> planets, morePlanets; 

可以使用.from()這樣的:

moreMoons = new Map<String,int>.from(numMoons) 
    ..addAll({'Saturn' : 53 }); 
    planets = new List<String>.from(numMoons.keys); 
    morePlanets = new List<String>.from(planets) 
    ..add('Pluto'); 

注意List.from()更普遍地接受一個迭代器,而不僅僅是一個List

爲了完整起見,我應該提及dart:htmlNode類定義了clone()方法。


布洛赫, 「有效的Java」 第2版,第11項。
B. Venners, "Josh Bloch on Design: Copy Constructor versus Cloning", 2002。從這裏引用。從文章引用:

如果你讀過關於我的書克隆的項目,特別是如果你的字裏行間,你會知道,我認爲克隆是深深打破。 --- J.Bloch

Dart Issue #6459, clone instance(object)

+4

Josh Bloch實際上參與了Dart collections API的一些早期設計。 [舊採訪](https://www.youtube.com/watch?v=wmsVHdllIPM)。 –

+1

.from()和.addAll()實際上並不是一個克隆。他們在新的Map/List/Set中添加一個引用。例如:Map map1 = { 'one':{'name':1}, 'two':{'name':2}, 'three':['''''' :1, 'b':2 }, 'b':{ 'A':3, 'b':4 } }] }; Map map2 = new Map.from(map1); map2 ['two'] ['name'] = 4; 更改map2 ['two'] ['name']後,map1也發生了變化 – kzhdev

+1

正確。 '.from()'是一個_shallow_拷貝構造函數。爲了清楚起見,我從來沒有說'.from()'執行了一個克隆操作。我寫的是'clone()'是一種拷貝構造函數。 –