2014-02-13 6 views

Antwort

11

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:htmlNode 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

Dart Issue #6459, clone instance(object).

+4

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). –

+1

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

+1

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. –