11
來自Java背景:什麼是推薦的方式來「克隆」飛鏢List
,Map
和Set
?克隆一個列表,映射或設置在飛鏢
來自Java背景:什麼是推薦的方式來「克隆」飛鏢List
,Map
和Set
?克隆一個列表,映射或設置在飛鏢
在Java中使用clone()
是棘手且值得懷疑的1,2。實際上,clone()
是一個拷貝構造函數,對此,Dart List
,Map
和Set
類型每個都有一個名爲.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:html
Node
類定義了clone()方法。
布洛赫, 「有效的Java」 第2版,第11項。
B. Venners, "Josh Bloch on Design: Copy Constructor versus Cloning", 2002。從這裏引用。從文章引用:
如果你讀過關於我的書克隆的項目,特別是如果你的字裏行間,你會知道,我認爲克隆是深深打破。 --- J.Bloch
Josh Bloch實際上參與了Dart collections API的一些早期設計。 [舊採訪](https://www.youtube.com/watch?v=wmsVHdllIPM)。 –
.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
正確。 '.from()'是一個_shallow_拷貝構造函數。爲了清楚起見,我從來沒有說'.from()'執行了一個克隆操作。我寫的是'clone()'是一種拷貝構造函數。 –