0

我有一个创建List<Long>. 然后我有另一个类,其状态为 a 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;
    }



}
4

3 回答 3

1

由于testing 您的类中的引用指的是您在主方法中创建的相同列表,因此进行任何更改都会更改主方法列表。如果您想使用setTesting方法中传递的列表创建一个新列表,请执行以下操作:

   public void setTesting(List<Long> list) {
        this.testing = new ArrayList<Long>(list);
    }

使用new关键字 in setTesting,将使用输入列表创建一个新列表。对这个新列表的任何更改都不会影响原来的 main 方法列表。

您也可以从类级别删除测试列表的初始化,只需声明它:

private List<Long> testing;
于 2013-09-14T06:21:18.213 回答
1

制作防御副本。

public void setTesting(List<Long> list) {
     this.testing = new ArrayList<Long>(list);
    }

当前的问题是您的Test对象和main方法都引用同一个列表。因此,如果有人修改了其他人看到的列表。解决方案就是为他们两个提供不同的副本。

提醒一句:上面的解决方案也会在新列表中复制相同的引用,尽管在这里没关系。

于 2013-09-14T06:21:44.947 回答
1

发生这种情况是因为只有一个List<Long>. 在main您将其传递给setTestingclass 的方法中Test,但您只是存储对在 中创建的列表的引用main。请记住,在 Java 中,变量是对对象的引用——它们不是对象本身。如果您使用=,就像您在setTesting方法中所做的那样,您只是将引用复制到列表中,而不是创建列表的副本。如果您希望Test对象拥有自己的副本,则必须自己复制列表:

public void setTesting(List<Long> list) {
    // Creates a copy of the list
    this.testing = new ArrayList<Long>(list);
}
于 2013-09-14T06:23:56.437 回答