Solución:
Uso de clone()
en Java es complicado y cuestionable1,2. Efectivamente, clone()
es un constructor de copias y para eso, el Dart List
, Map
y Set
cada tipo tiene un constructor con nombre llamado .from()
que realizan una copia superficial; por ejemplo, dadas estas declaraciones
Map<String, int> numMoons, moreMoons;
numMoons = const <String,int>{ 'Mars' : 2, 'Jupiter' : 27 };
List<String> planets, morePlanets;
puedes usar .from()
como esto:
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');
Tenga en cuenta que List.from()
más generalmente acepta un iterador en lugar de solo un List
.
En aras de la integridad, debo mencionar que el dart:html
Node
La clase define un método clone ().
1 J. Bloch, “Java eficaz“2ª Ed., Artículo 11.
2 B. Venners, “Josh Bloch sobre diseño: constructor de copias versus clonación“, 2002. Referenciado aquí3. Cita del artículo:
Si ha leído el artículo sobre la clonación en mi libro, especialmente si lee entre líneas, sabrá que creo que la clonación está profundamente rota. — J.Bloch
3 Dart Issue # 6459, instancia de clonación (objeto).
Para listas y conjuntos, normalmente uso
List<String> clone = []..addAll(originalList);
La advertencia, como menciona @kzhdev, es que addAll()
y from()
[Do] realmente no hacer un clon. Añaden una referencia en el nuevo Mapa / Lista / Conjunto.
Por lo general, eso está bien para mí, pero lo tendré en cuenta.
Si está usando dart> 2.3.0, puede usar el operador de propagación algo como:
List<int> a = [1,2,3];
List<int> b = [...a]; // copy of a