Другой класс, взаимодействующий с переменными в методе main
У меня есть основной метод, который создает List<Long>
, Затем у меня есть другой класс, состояние которого List<Long>
- цель этого класса состоит в том, чтобы взять в основной метод List<Long>
как его состояние и делать манипуляции с ним, не затрагивая основной метод List<Long>
,
Однако проблема, с которой я сталкиваюсь, заключается в том, что этот другой класс влияет как на его состояние (его private List<Long>
) а также List<Long>
в основном методе.
Как мне настроить мой код так, чтобы setTesting(...)
может только влиять на состояние своего класса?
public class Main {
public static void main(String[] args) {
final List<Long> mainlist = new ArrayList<Long>();
mainlist.add((long) 1);
mainlist.add((long) 2);
mainlist.add((long) 3);
Test testlist = new Test();
testlist.setTesting(mainlist);
System.out.println(testlist.getTesting());
testlist.removal((long) 1);
System.out.println(testlist.getTesting());
}
}
public class Test {
private List<Long> testing = new ArrayList<Long>();
public Test() {
}
public void removal(Long remove) {
this.testing.removeAll(Collections.singleton(remove));
}
public void setTesting(List<Long> list) {
this.testing = list;
}
public List<Long> getTesting() {
return this.testing;
}
}
3 ответа
Как testing
ссылка в вашем классе ссылается на тот же список, который вы создали в методе main, поэтому внесение любого изменения изменит список основного метода. Если вы хотите создать новый список, используя список, переданный в вашем setTesting
метод, затем сделайте что-то вроде этого:
public void setTesting(List<Long> list) {
this.testing = new ArrayList<Long>(list);
}
с использованием new
ключевое слово в setTesting
, новый список будет создан с использованием списка ввода. Любые изменения в этом новом списке не влияют на первоначальный основной список методов.
Также вы можете удалить инициализацию списка тестирования с уровня класса, просто объявив его:
private List<Long> testing;
Это происходит потому, что есть только один List<Long>
, в main
метод вы передаете это setTesting
в классе Test
, но там вы просто храните ссылку на список, который был создан в main
, Помните, что в Java переменные - это ссылки на объекты, а не сами объекты. Если вы используете =
как вы делаете в своем setTesting
метод, вы только копируете ссылку на список, вы не создаете копию списка. Если вы хотите Test
Чтобы объект имел свою собственную копию, вам придется скопировать список самостоятельно:
public void setTesting(List<Long> list) {
// Creates a copy of the list
this.testing = new ArrayList<Long>(list);
}
Сделайте защитную копию.
public void setTesting(List<Long> list) {
this.testing = new ArrayList<Long>(list);
}
Текущая проблема заключается в том, что ваш Test
объект и main
оба метода относятся к одному и тому же списку. Так что, если кто-то изменяет список, другой видит это. Решение состоит в том, чтобы просто иметь разные копии для них обоих.
Предупреждение: приведенное выше решение скопирует те же ссылки в новом списке, но здесь это не имеет значения.