Kommt aus einem Java-Hintergrund: Was ist die empfohlene Methode zum "Klonen" eines Dart List
, Map
und Set
?Klonen Sie eine Liste, Karte oder setzen Sie in Dart
Antwort
Verwendung von clone()
in Java ist schwierig und fraglich 1,2. Effektiv ist clone()
ein Kopierkonstruktor und dafür haben die Dart List
, Map
und Set
Typen jeweils eine named constructor namens .from()
, die eine shallow copy; z.B. angesichts dieser Erklärungen
Map<String, int> numMoons, moreMoons;
numMoons = const <String,int>{ 'Mars' : 2, 'Jupiter' : 27 };
List<String> planets, morePlanets;
Sie .from()
wie diese verwenden:
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');
Beachten Sie, dass List.from()
generell einen Iterator eher akzeptiert als nur ein List
.
Der Vollständigkeit halber sollte ich erwähnen, dass die dart:html
Node
Klasse eine clone() Methode definiert.
J. Bloch, "Effective Java" 2. Aufl., Punkt 11.
B. Venners, "Josh Bloch on Design: Copy Constructor versus Cloning", 2002. Von hier referenziert . Zitat aus dem Artikel:
Wenn Sie den Artikel über das Klonen in meinem Buch gelesen haben, vor allem, wenn man zwischen den Zeilen lesen, werden Sie wissen, dass ich denke, Klon tief gebrochen ist. --- J.Bloch
Josh Bloch war tatsächlich in einigen der frühen Design der Dart-Sammlungen API beteiligt. [Altes Interview] (https://www.youtube.com/watch?v=wmsVHdllIPM). –
Die .from() und .addAll() machen nicht wirklich einen Klon. Sie fügen eine Referenz in der neuen Map/List/Set hinzu. Beispiel: Map map1 = { 'eins': {'name': 1}, 'zwei': {'name': 2}, 'drei': [{ 'a': { 'A' : 1, 'B': 2 }, 'b': { 'A': 3, 'B': 4 } }] }; Karte map2 = neue Map.from (map1); map2 ['zwei'] ['name'] = 4; Nachdem map2 ['two'] ['name'] geändert wurde, änderte map1 auch – kzhdev
Right. '.from()' ist ein _shallow_ Kopierkonstruktor. Nur um klar zu sein, ich habe nie gesagt, dass '.from()' eine Klonoperation durchgeführt hat. Was ich geschrieben habe, war das 'clone()' war eine Art Kopierkonstruktor. –