Ваш первый пример:
public Assembler(List<Fragment> fragments) {
this.fragments = fragments;
}
В первом примере вы перезаписываете список. Любые элементы, которые использовали , чтобы быть в this.fragments
, теперь больше не находятся в this.fragments
- скорее, this.fragments
теперь указывает на совершенно новый список.
То, имеет ли значение , зависит от того, как this.fragments
было объявлено изначально. Вполне возможно, что он был объявлен таким образом, что он уже содержал некоторые переменные:
private List<Fragment> fragments = new ArrayList<Fragment>(Arrays.asList(fragment1, fragment2, fragment3));
В этом случае все они будут перезаписаны. Но это необычное поведение для переменной экземпляра.
Другая, более вероятная причина, по которой он может не пройти тест, связана с ссылками - где-то может быть тест, который выполняет что-то вроде этого:
Assembler a = new Assembler(fragments);
assertFalse(fragments == a.fragments);
в этом случае будет явно проверяться, что вы не просто скопировали список, оценивая, вызывается ли одна и та же ссылка.
Точно так же, если вы выполнили задание, это может привести к непреднамеренному поведению, такому как добавление элемента в fragments
и отображение его в a.fragments
- что также, вероятно, нежелательно.
В последнем примере вместо этого вы добавляете в список:
public Assembler(List<Fragment> fragments) {
for(int i = 0; i<fragments.size(); i++){
this.fragments.add(fragments.get(i));
}
}
Это сохраняет ссылки на каждый отдельный элемент, но без переназначения this.fragments
- так что даже после этого fragments
и this.fragments
ссылаются на разные объекты, и, таким образом, изменение одного не изменит другого.
Однако есть более краткий способ сделать это, чем циклический цикл for
:
public Assembler(List<Fragment> fragments) {
this.fragments.addAll(fragments);
}