java - 如何使用修改数据字段的方法返回新对象,而不会弄乱用于调用该方法的对象的数据字段
问题描述
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]
解决方案
'mylist' 是一个对象(相对于原语,如 'long'、'int' 等)。这意味着任何变量都是对对象的引用(如果您来自 C,则为“指针”)。这就像一个藏宝图到宝藏,你已经创建了一个新的对象,它得到了一个藏宝图的副本,但你根本没有复制这个宝藏。
唯一的办法就是……复制宝藏。您必须创建一个全新的列表。不知何故,new ArrayList<Integer>()
需要执行两次(同一行至少两次,或者该代码需要出现在至少两个地方)。
java中没有合适的内置系统来复制任何东西(有“克隆”系统但是......你不想使用它)。
请注意,列表不必是不可变的。myClass
从样式的角度来看,如果类完全控制其字段并且不再允许您传入列表,或者它制作输入列表的副本(new ArrayList<Integer>(someList);
将制作完整的副本) ,则可能更有意义。
推荐阅读
- amazon-web-services - 通过未签名的 POST 到 REST API 调用 AWS Lambda
- php - 我想使用 PHP 删除两个数组中的公共元素
- database - Rust - 我可以让这个柴油 dsl::find() 函数更通用吗?
- java - Java表问题与获取列的平均值
- css - 当下一个 flex 元素有长文本时,Flex 增长和 Flex 填充或收缩不起作用
- html - 具有最少列和行以适应屏幕的 CSS 网格
- asp.net-core - ASP.NET Core:生成控制器基础的 URL(不执行操作)
- c# - UseHttpsRedirection 不能可靠地工作?
- r - lavaan 错误:模型是列表,但不是参数表?在 lavaan,Rstudio
- java - 如何修复线程“main”java.lang.StringIndexOutOfBoundsException中的异常:字符串索引超出范围:错误