You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

拷贝List到临时列表删除属性时原列表属性同步变更该如何解决

问题原因

这是典型的浅拷贝导致的问题。默认拷贝List时,只会复制列表中存储的对象内存引用,新旧两个列表实际指向完全相同的Order对象实例,因此修改任意一个列表内的对象属性,都会同步影响另一个列表的结果。

推荐解决方案

方案1:用DTO做视图层隔离(最适配需求场景)

不需要修改原列表或拷贝对象,专门定义两类视图对应的数据传输类即可,这也是业务开发的通用规范:

  • 定义SimpleOrderDTO类,仅存放简略展示需要的属性,例如orderNumber、下单时间等
  • 定义FullOrderDTO类,存放Order对象的全部属性
  • 列表查询时,将原List中的Order对象批量转换为SimpleOrderDTO返回;单ID查询时,将目标Order转换为FullOrderDTO返回即可,全程不会修改原List的任何内容。

方案2:对List做深拷贝(如果坚持使用拷贝后删属性的实现逻辑)

如果一定要用复制列表删除冗余属性的实现方式,需要先对List内的每个Order对象做深拷贝:

  1. 给Order类添加拷贝构造方法:
public class Order {
    private String orderNumber;
    // 其余属性省略...

    // 拷贝构造方法
    public Order(Order source) {
        this.orderNumber = source.orderNumber;
        // 其余属性依次赋值,如果存在引用类型属性也要做对应深拷贝
    }
}
  1. 拷贝List时遍历生成新的Order实例,不要直接使用new ArrayList<>(原列表)这类浅拷贝写法:
List<Order> copyList = originalList.stream()
    .map(Order::new)
    .toList();

此时修改copyList内的对象属性,不会影响原列表的内容。

注意:直接删除对象属性的实现思路本身存在缺陷,同一个类的实例结构是固定的,所谓的删除属性本质是把属性赋值为null,后续如果其他逻辑需要用到这些属性会触发空指针异常,更推荐优先使用方案1。

内容的提问来源于stack exchange,提问作者CSBa18

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:06:05