Java 另一个类与main方法中的变量交互
我有一个main方法,它创建一个Java 另一个类与main方法中的变量交互,java,methods,scope,private,final,Java,Methods,Scope,Private,Final,我有一个main方法,它创建一个列表。然后我有另一个类,它的状态是列表——这个类的目标是将主方法的列表作为它的状态,并对它进行操作,而不影响主方法的列表 然而,我面临的问题是,另一个类既影响它的状态(它的私有列表),也影响主方法中的列表 如何调整代码,使setTesting(…)只能影响其类的状态 public class Main { public static void main(String[] args) { final List<Long> ma
列表
。然后我有另一个类,它的状态是列表
——这个类的目标是将主方法的列表
作为它的状态,并对它进行操作,而不影响主方法的列表
然而,我面临的问题是,另一个类既影响它的状态(它的私有列表),也影响主方法中的列表
如何调整代码,使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;
}
}
公共类主{
公共静态void main(字符串[]args){
最终列表mainlist=newarraylist();
主列表。添加((长)1);
主列表。添加((长)2);
主列表。添加((长)3);
测试列表=新测试();
testlist.setTesting(mainlist);
System.out.println(testlist.getTesting());
测试列表。删除((长)1);
System.out.println(testlist.getTesting());
}
}
公开课考试{
私有列表测试=新建ArrayList();
公开考试(){
}
公共空间移除(长移除){
this.testing.removeAll(Collections.singleton(remove));
}
公共作废设置(列表){
这个测试=列表;
}
公共列表getTesting(){
返回此文件。正在测试;
}
}
因为类中的测试
引用引用的是您在main方法中创建的相同列表,所以进行任何更改都会更改main方法列表。如果要使用setTesting
方法中传递的列表创建新列表,请执行以下操作:
public void setTesting(List<Long> list) {
this.testing = new ArrayList<Long>(list);
}
由于类中的测试
引用引用的是您在main方法中创建的相同列表,因此进行任何更改都将更改main方法列表。如果要使用setTesting
方法中传递的列表创建新列表,请执行以下操作:
public void setTesting(List<Long> list) {
this.testing = new ArrayList<Long>(list);
}
制作防御性副本
public void setTesting(List<Long> list) {
this.testing = new ArrayList<Long>(list);
}
public void setTesting(列表){
this.testing=新的ArrayList(列表);
}
当前的问题是,您的Test
对象和main
方法都引用相同的列表。因此,如果有人修改列表,其他人会看到它。解决方案就是让它们都有不同的副本
警告:上面的解决方案也会在新列表中复制相同的引用,不过在这里这并不重要。制作一个防御性副本
public void setTesting(List<Long> list) {
this.testing = new ArrayList<Long>(list);
}
public void setTesting(列表){
this.testing=新的ArrayList(列表);
}
当前的问题是,您的Test
对象和main
方法都引用相同的列表。因此,如果有人修改列表,其他人会看到它。解决方案就是让它们都有不同的副本
警告:上面的解决方案也会在新列表中复制相同的引用,不过在这里这并不重要。之所以会这样,是因为只有一个列表。在main
方法中,您将其传递给类Test
中的setTesting
,但在那里您只存储了对在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(列表){
//创建列表的副本
this.testing=新的ArrayList(列表);
}
发生这种情况是因为只有一个列表。在main
方法中,您将其传递给类Test
中的setTesting
,但在那里您只存储了对在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(列表){
//创建列表的副本
this.testing=新的ArrayList(列表);
}
关于你的警告语:但在这种情况下这并不重要,因为类Long
是不可变的。关于你的警告语:但在这种情况下这并不重要,因为类Long
是不可变的。你会因为结尾的建议而得到最佳答案。你会因为结尾的建议而得到最佳答案。