ps:碰到一个业务bug,抛出异常UnsupportedOperationException,检查代码发现在调用链中,listA=ImmutableList.of(xxx);导致listA为不可变List,调用retain()方法抛出异常;
// 原始代码
……
listA.retainAll(listB);
// 修改代码1
listA = listA.stream().filter(listB::contains).collector(Collectors.toList);
……
然后我修改:
listA = new ArrayList<>();
listA.add(xxx);
因为处理过程有好几个分支,为了避免后续其他地方有listA=ImmutableList.of(xxx);此类情况,所以我修改了retain为stream().filter();
然后调试发现值listA修改失败;
还原为listA.retainAll(listB);修改成功;
原因:Java方法参数均为值传递
参数为基本类型
public class Main {
public static void main(String[] args) {
// 创建一个整数变量并赋值
int number = 10;
// 调用方法并将number传递进去
changeNumber(number);
// 输出原始变量的值,仍然是10,未被方法改变
System.out.println(number); // 输出: 10
}
// 定义一个方法,尝试改变参数的值
public static void changeNumber(int num) {
num = 20; // 这里只是改变了方法内部副本的值
}
}
参数为引用类型
引用类型其实传递到方法的其实是引用地址的值,两个引用变量都指向原对象;
所以object.value = xxx;会修改值;
而object = new Object()其实只是修改了当前方法入参的引用对象,而原对象未被修改
public class Main {
public static void main(String[] args) {
// 创建一个对象
MyObject obj = new MyObject();
obj.value = 10;
// 调用方法并将对象传递进去
changeObject(obj);
// 输出对象的值,已被方法改变
System.out.println(obj.value); // 输出: 20
// 调用set方法
setObject(obj);
// 输出对象的值,值不变
System.out.println(obj.value); // 输出: 20
}
public static void changeObject(MyObject obj) {
obj.value = 20; // 这里修改的是对象的实际状态
}
public static void setObject(MyObject obj) {
obj= new MyObjectc(); // 这里修改的是对象的实际状态
}
static class MyObject {
int value;
}
}