Java有陷阱,用时需谨慎-慎用入参做返回值
共 2469字,需浏览 5分钟
·
2021-12-28 19:15
阅读本文大概需要 2.8 分钟。
来自:网络
问题背景
@Named
public class AService {
private SupplyAssignment localSupply = new SupplyAssignment();
@Inject
private BService bervice;
public ListcalcSupplyAssignment() = bService.getLocalSupplyList(this.localSupply);
ListsupplyList
…
return supplyList;
}
}
@Named
public class BService {
public ListgetLocalSupplyList (SupplyAssignment localSupply)
SupplyAssignment supplyAssignment = this.getSupplyAssignment();
// 希望localSupply被重新赋值后返回
localSupply = supplyAssignment;
…
return supplyList;
}
}
问题原因
值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
解决方案
方案1:入参不要用作返回值
方案2:入参不要赋值新对象
@Named
public class BService {
public ListgetLocalSupplyList (SupplyAssignment localSupply) = this.getSupplyAssignment();
SupplyAssignment supplyAssignment
// 针对localSupply不能新建引用,只能重新赋值属性
BeanUtils.copyProperties(supplyAssignment, localSupply);
…
return supplyList;
}
}
推荐阅读:
内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper、数据结构、限流熔断降级......等技术栈!
⬇戳阅读原文领取! 朕已阅