Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 另一个类与main方法中的变量交互_Java_Methods_Scope_Private_Final - Fatal编程技术网

Java 另一个类与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

我有一个main方法,它创建一个
列表
。然后我有另一个类,它的状态是
列表
——这个类的目标是将主方法的
列表
作为它的状态,并对它进行操作,而不影响主方法的
列表

然而,我面临的问题是,另一个类既影响它的状态(它的
私有列表),也影响主方法中的
列表

如何调整代码,使
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
是不可变的。你会因为结尾的建议而得到最佳答案。你会因为结尾的建议而得到最佳答案。