首页 > 解决方案 > 如何使用修改数据字段的方法返回新对象,而不会弄乱用于调用该方法的对象的数据字段

问题描述

public final class myClass {
final List<Integer> mylist;

    public myClass(List<Integer> l) {
    this.mylist = l;
}
    myClass method(){

for (int i=0;i<mylist.size();i++) {

    mylist.set(i, mylist.get(i)*2);

}
        return new myClass(mylist);
    }

    public static void main(String[] args) {
        List<Integer> l1=new ArrayList<Integer>();

        l1.add(2);
        l1.add(4);

        myClass t=new myClass(l1);

        System.out.println(t.method().mylist);
        System.out.println(t.mylist);

    }

}

我如何使用该方法并返回一个新的 myclass 对象而不更改 t 对象的列表元素 OUTPUT: [4, 8] [4, 8]

标签: javalist

解决方案


'mylist' 是一个对象(相对于原语,如 'long'、'int' 等)。这意味着任何变量都是对对象的引用(如果您来自 C,则为“指针”)。这就像一个藏宝图到宝藏,你已经创建了一个新的对象,它得到了一个藏宝图的副本,但你根本没有复制这个宝藏。

唯一的办法就是……复制宝藏。您必须创建一个全新的列表。不知何故,new ArrayList<Integer>()需要执行两次(同一行至少两次,或者该代码需要出现在至少两个地方)。

java中没有合适的内置系统来复制任何东西(有“克隆”系统但是......你不想使用它)。

请注意,列表不必是不可变的。myClass从样式的角度来看,如果类完全控制其字段并且不再允许您传入列表,或者它制作输入列表的副本(new ArrayList<Integer>(someList);将制作完整的副本) ,则可能更有意义。


推荐阅读