Другой класс, взаимодействующий с переменными в методе 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 оба метода относятся к одному и тому же списку. Так что, если кто-то изменяет список, другой видит это. Решение состоит в том, чтобы просто иметь разные копии для них обоих.

Предупреждение: приведенное выше решение скопирует те же ссылки в новом списке, но здесь это не имеет значения.

Другие вопросы по тегам