Клонирование списка, карты или набора в Dart

исходя из фона Java: каков рекомендуемый способ "клонирования" дротика List, Map и Set?

3 ответов


использование clone() в Java сложно и сомнительно1,2. Эффективно,clone() является конструктором копирования и для этого, дротик List, Map и Set типы каждый имеют Constructor, в имени .from() для выполнения мелкая копия; например, учитывая эти заявления

  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 () метод.


1 Я. Блоха, "Эффективная Java" 2-е изд. Пункт 11.
2Б. Веннерс, "Джош блох о дизайне: конструктор копирования против клонирования", 2002. Ссылка отсюда3. Цитата из статьи:

если вы читали статью о клонировании в моей книге, особенно если Вы читаете между строк, вы знаете, что я думаю, что клон глубоко сломан. --- Джей Блох!--34-->

3выпуск дротика #6459, экземпляр клона (объект).


данный ответ хорош, но имейте в виду generate конструктор, который полезен, если вы хотите "вырастить" список фиксированной длины, например:

List<String> list = new List<String>(5);
int depth = 0; // a variable to track what index we're using

...
depth++;
if (list.length <= depth) {
  list = new List<String>.generate(depth * 2,
      (int index) => index < depth ? list[index] : null,
      growable: false);
}

для глубокой копии (клонирования) вы можете использовать:

Map<String, dynamic> src = {'a': 123, 'b': 456};
Map<String, dynamic> copy = json.decode(json.encode(src));

но могут быть некоторые проблемы с производительностью.