#list #class #dart
Вопрос:
Вопрос о списке объектов в dart (Флаттер)
Привет
классный мультфильм { . .
}
Listlt;Cartoongt; L1 = []; …. ... Listlt;Cartoongt; L2 = [];
Я определяю ниже новый список L2, содержащий объекты из списка L1, удовлетворяющие некоторому условию
Listlt;Cartoongt; L2 = []; L2.clear(); for (Cartoon _thisObjet in L1) { if (_thisObjet.xxx == yyyy) { // L2.add(_thisObjet); } }
Я проверяю с помощью отладчика , что всякий раз, когда я изменяю значение элемента в объекте L2, элемент также изменяется в элементе. исходный объект в списке L1.
Это не ожидаемый результат
По-моему ,я думал, что эти 2 списка должны быть независимыми, поэтому, если у кого-то есть объяснение, я был бы признателен
Комментарии:
1. Не могли бы вы попробовать поискать, связанный с deepcopy?
Ответ №1:
Все переменные в Dart-это ссылки на объекты. То же самое касается списков, где списки содержат только ссылки на объекты.
Таким образом, ваш Listlt;Cartoongt;
содержит ссылки на Cartoon
объекты. Это означает, что когда вы просматриваете L1
, хотя вы просматриваете ссылки на Cartoon
объекты, и когда вы вставляете одну из этих ссылок в L2
список, теперь у вас есть два списка, содержащих ссылку на один и тот же объект.
Это также означает, что при внесении изменений в этот объект изменения могут наблюдаться при повторении обоих списков, так как существует только один объект.
Поэтому, если вы хотите предотвратить изменение Cartoon
объекта, которое будет наблюдаться в другом списке, вам нужно сделать копию своего Cartoon
объекта и внести изменения в копию. Лучшее, что вы можете здесь сделать, — это создать метод Cartoon
, который возвращает копию объекта, или создать конструктор, который использует Cartoon
объект для создания другого Cartoon
объекта.
(Важное замечание , связанное с этой темой, касается неизменяемых объектов, таких как int
String
и так далее (например, ваш собственный тип объектов, который содержит только final
поля). Объекты такого типа не могут изменить свое внутреннее состояние, но вы вынуждены создавать новый объект каждый раз, когда хотите внести изменения. Создавая неизменяемые объекты, вы можете предотвратить такого рода проблемы, поскольку любое изменение объекта вынуждает вас получить новый объект. Но учтите, как и все остальное, неизменность-это не серебряная пуля для решения всех проблем.)