Java编程:慎用参数作为返回值的陷阱解析
"Java开发中的一个常见陷阱是错误地使用入参作为返回值。这个问题涉及到参数传递机制,尤其是Java中的值传递特性。在给定的示例中,服务A通过入参`localSupply`调用服务B,期望服务B修改`localSupply`后返回更新后的值,但实际上由于值传递,这种做法无法达到预期效果。" 在Java中,方法参数的传递方式是值传递,这意味着当一个对象作为参数传递给方法时,实际上是传递了该对象的引用副本,而不是对象本身。因此,尽管方法内部可以改变对象的属性,但是不能更改对象引用。在上述代码中,服务A的`calcSupplyAssignment`方法将`localSupply`对象传递给服务B的`getLocalSupplyList`方法,后者试图将`localSupply`的引用更改为`supplyAssignment`的引用,但由于值传递,这个更改只发生在方法内部,对外部的`localSupply`对象没有影响。 服务B中,`getLocalSupplyList`方法的意图是更新传入的`localSupply`,然后返回与之相关的`supplyList`。但是,由于Java的对象引用是按值传递的,`localSupply`在服务B中被重新赋值后,这个新的引用只存在于方法内部的作用域,当方法返回时,原始的`localSupply`对象引用保持不变,导致服务A无法接收到更新后的`localSupply`。 要解决这个问题,有几种可能的解决方案: 1. 返回`supplyAssignment`:服务B可以返回`supplyAssignment`对象,让服务A根据需要更新其`localSupply`变量。这样,服务B就不再需要修改传入的参数。 2. 使用`LocalSupply`的副本:服务B可以创建`localSupply`的一个副本,修改副本并返回,使得服务A可以自由地使用返回的新副本而不会影响原来的对象。 3. 使用`Optional`包装返回值:如果不想修改返回类型,可以考虑使用`java.util.Optional`来包装`SupplyAssignment`,这样服务A在解包时可以明确知道值是否已被修改。 4. 使用回调或监听器:服务B可以提供一个回调接口或事件监听器,让服务A在适当的时候接收状态更新的通知,而不是立即返回更新后的值。 理解Java的值传递机制对于编写正确且可预测的代码至关重要。在设计API或服务交互时,应确保清楚地定义参数的用途,避免依赖于隐含的行为,如期望方法修改传入的参数。此外,充分的文档和注释也可以帮助减少这种误解。在编写代码时,遵循这些最佳实践可以提高代码的清晰度和可维护性,从而避免类似陷阱的发生。
![](https://csdnimg.cn/release/download_crawler_static/88619469/bg1.jpg)
下载后可阅读完整内容,剩余6页未读,立即下载
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/6b2ea2d510824682ac2af676104b9caf_abackcab.jpg!1)
- 粉丝: 2737
- 资源: 5598
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- Hadoop生态系统与MapReduce详解
- MDS系列三相整流桥模块技术规格与特性
- MFC编程:指针与句柄获取全面解析
- LM06:多模4G高速数据模块,支持GSM至TD-LTE
- 使用Gradle与Nexus构建私有仓库
- JAVA编程规范指南:命名规则与文件样式
- EMC VNX5500 存储系统日常维护指南
- 大数据驱动的互联网用户体验深度管理策略
- 改进型Booth算法:32位浮点阵列乘法器的高速设计与算法比较
- H3CNE网络认证重点知识整理
- Linux环境下MongoDB的详细安装教程
- 压缩文法的等价变换与多余规则删除
- BRMS入门指南:JBOSS安装与基础操作详解
- Win7环境下Android开发环境配置全攻略
- SHT10 C语言程序与LCD1602显示实例及精度校准
- 反垃圾邮件技术:现状与前景
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)