拷贝List到临时列表删除属性时原列表属性同步变更该如何解决
问题原因
这是典型的浅拷贝导致的问题。默认拷贝List时,只会复制列表中存储的对象内存引用,新旧两个列表实际指向完全相同的Order对象实例,因此修改任意一个列表内的对象属性,都会同步影响另一个列表的结果。
推荐解决方案
方案1:用DTO做视图层隔离(最适配需求场景)
不需要修改原列表或拷贝对象,专门定义两类视图对应的数据传输类即可,这也是业务开发的通用规范:
- 定义
SimpleOrderDTO类,仅存放简略展示需要的属性,例如orderNumber、下单时间等 - 定义
FullOrderDTO类,存放Order对象的全部属性 - 列表查询时,将原List中的Order对象批量转换为
SimpleOrderDTO返回;单ID查询时,将目标Order转换为FullOrderDTO返回即可,全程不会修改原List的任何内容。
方案2:对List做深拷贝(如果坚持使用拷贝后删属性的实现逻辑)
如果一定要用复制列表删除冗余属性的实现方式,需要先对List内的每个Order对象做深拷贝:
- 给Order类添加拷贝构造方法:
public class Order { private String orderNumber; // 其余属性省略... // 拷贝构造方法 public Order(Order source) { this.orderNumber = source.orderNumber; // 其余属性依次赋值,如果存在引用类型属性也要做对应深拷贝 } }
- 拷贝List时遍历生成新的Order实例,不要直接使用
new ArrayList<>(原列表)这类浅拷贝写法:
List<Order> copyList = originalList.stream() .map(Order::new) .toList();
此时修改copyList内的对象属性,不会影响原列表的内容。
注意:直接删除对象属性的实现思路本身存在缺陷,同一个类的实例结构是固定的,所谓的删除属性本质是把属性赋值为null,后续如果其他逻辑需要用到这些属性会触发空指针异常,更推荐优先使用方案1。
内容的提问来源于stack exchange,提问作者CSBa18
相关产品推荐
相关产品推荐

