2026-02-10 08:44:21
在Java中,慎用入参作为返回值,否则可能导致代码逻辑错误且难以维护,核心问题在于Java是值传递而非引用传递,对入参重新赋值不会影响原始对象。
问题背景以下是一段存在问题的代码示例:
服务A调用服务B获取supplyList,同时希望修改localSupply的状态值,但为避免修改calcSupplyAssignment接口的返回类型,将localSupply作为入参并尝试用作返回值。
服务B内部对入参localSupply重新赋值为supplyAssignment,期望返回新值,但实际无效。
问题原因值传递:调用函数时复制实际参数的值传递到函数中,函数内修改参数不影响实际参数。
引用传递:调用函数时传递实际参数的地址,函数内修改参数会影响实际参数。
Java采用值传递:没有指针概念,方法得到的是参数值的拷贝,无法直接修改传递给它的任何参数变量的内容。
服务A调用服务B时,服务B的参数localSupply是服务A的localSupply的拷贝,二者初始指向同一对象supplyAssignment1。

服务B内部对参数localSupply重新赋值为supplyAssignment后,服务B的参数localSupply指向新对象supplyAssignment2。

服务A的localSupply和服务B的参数localSupply指向不同对象,对服务B的参数localSupply的修改不会影响服务A的localSupply的原值。
避免将入参直接作为返回值使用,重新设计方法逻辑,明确返回值与入参的关系,提高代码的可读性和可维护性。
直接在入参的对象上修改状态,而不赋值新对象。例如,使用Spring的工具类BeanUtils的copyProperties方法,将一个对象的属性值复制到另一个对象的属性上。
修改后的服务B代码:
