赞
踩
在项目开发中,有一次的业务需求是需要对订单列表中信息进行处理,同时保留原订单信息列表,简单直接上手撸,在对原订单List<Order>中值进行操作时,最后发现复制出来的List内的对象值也同时改变。第一次写的代码如下
- Map<String,Object> resMap = new HashMap<>();
- List<Order> orderList = getOrder(queryDto);
- // 记录原单据
- List<Order> orginalOrderList = new LinkedList<>();
- orginalOrderList.addAll(orderList);
- // 保存原单据
- resMap.put("orginalOrderList",orginalOrderList);
-
- // orderList.foreach(order -> {
- // 模拟业务处理
- order.setBillingNo(billingNo);
- ...
- });
-
- // 保存处理后单据
- resMap.put("orderList",orderList);
-
在处理完业务后,发现保存的原单据内的值也同时改变了,和新单据一致,后来改成了将原单据List 定义为final类型的,但是还是不起效果,后来才想起来,List中值为对象,并非基础数据类型,这些对象对应的内存中地址是一致的,单据改变后,内存地址并没有改变,所以导致保存的原单据值也是同样改变了,后来查询了下,找到了解决方案,使用BeanUtils.clonebean(Object object) ,解决了该问题
修改后代码如下
- Map<String,Object> resMap = new HashMap<>();
- List<Order> orderList = getOrder(queryDto);
- // 记录原单据
- List<Order> orginalOrderList = new LinkedList<>();
-
-
- // orderList.foreach(order -> {
- // 主要解决代码
- orginalOrderList.add((Order)BeanUtils.cloneBean(order));
-
- // 模拟业务处理
- order.setBillingNo(billingNo);
- ...
- });
-
- // 保存原单据
- resMap.put("orginalOrderList",orginalOrderList);
- // 保存处理后单据
- resMap.put("orderList",orderList);
-
记录下解决问题的方案,方便以后能用到,如果能够对你也有所帮助,那是更好
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。