我有一个创建List<Long>
的主方法。然后我有另一个类,其状态是List<Long>
- 这个类的目标是将main方法的List<Long>
作为其状态并对其进行操作而不影响main方法的List<Long>
。
然而,我面临的问题是,这个其他类会影响 其状态(private List<Long>
)以及 {{1}在主要方法中。
如何调整我的代码,使List<Long>
只能影响其类的状态?
setTesting(...)
答案 0 :(得分:1)
由于您的类中的testing
引用是指您在main方法中创建的相同列表,因此进行任何更改都将更改主方法列表。如果您想使用setTesting
方法中传递的列表创建新列表,请执行以下操作:
public void setTesting(List<Long> list) {
this.testing = new ArrayList<Long>(list);
}
使用new
中的setTesting
关键字,将使用输入列表创建新列表。对此新列表的任何更改都不会影响原始主方法列表。
您也可以从类级别删除测试列表的初始化,只需声明它:
private List<Long> testing;
答案 1 :(得分:1)
制作防御性副本。
public void setTesting(List<Long> list) {
this.testing = new ArrayList<Long>(list);
}
目前的问题是您的Test
对象和main
方法都引用了相同的列表。因此,如果有人修改了列表,则其他人会看到它。解决方案就是为它们提供不同的副本。
提醒一句:上面的解决方案也会在新列表中复制相同的引用,但这里并不重要。
答案 2 :(得分:1)
这是因为只有一个List<Long>
。在main
方法中,您将其传递到课程setTesting
中的Test
,但您只需存储对{{1}中创建的列表的引用}}。请记住,在Java中,变量是引用到对象 - 它们本身不是对象。如果您使用main
,就像使用=
方法一样,您只是复制对列表的引用,而不是创建列表的副本。如果您希望setTesting
对象拥有自己的副本,则您必须自己复制列表:
Test