gpt4 book ai didi

java - 如何使用修改数据字段的方法返回新对象,而不弄乱用于调用该方法的对象的数据字段

转载 作者:行者123 更新时间:2023-12-01 16:15:49 24 4
gpt4 key购买 nike

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 对象的列表元素输出:[4, 8][4, 8]

最佳答案

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

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

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

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

关于java - 如何使用修改数据字段的方法返回新对象,而不弄乱用于调用该方法的对象的数据字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62391862/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com