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

Java中如何避免对象克隆实现Record对象拆分

问题解决

你现在的实现做了完全没必要的全量序列化克隆,性能差是必然的,根据你是否允许修改原record对象,选对应方案即可,都不需要走序列化克隆:

  • 场景1:拆分后不需要保留原record对象的uid值,允许修改原对象
    直接复用原对象作为firstPart就行,连复制都不用做:

    Record secondPart = new Record();
    secondPart.setUid(record.getUid());
    record.setUid(null);
    // 执行完后record就是你要的firstPart,secondPart单独存uid
    

    这种方案没有任何全对象复制开销,不管Record对象多大、嵌套多深,性能都是常数级,是最优解。

  • 场景2:拆分后必须保留原record对象的完整状态,不能修改原对象
    别用基于序列化的克隆工具,给Record加一个复制构造器,只拷贝除uid外的字段即可:
    先在Record类中添加构造方法:

    public class Record implements Serializable {
        // 原有字段、get/set方法保持不变
    
        // 复制构造器:仅拷贝非uid字段
        public Record(Record source) {
            this.name = source.name;
            this.createTime = source.createTime;
            this.content = source.content;
            // 此处逐个赋值除uid外的所有字段即可
            // 引用类型字段如果需要深拷贝就单独处理,不需要的话直接赋值引用即可
        }
    }
    

    拆分逻辑改成:

    Record firstPart = new Record(record);
    Record secondPart = new Record();
    secondPart.setUid(record.getUid());
    

    这种方案只有普通的字段赋值操作,性能比序列化克隆高几个量级,逻辑完全可控,不会出现序列化带来的意外深拷贝问题。

如果Record字段太多,手写复制构造器太麻烦,可以用BeanUtils、BeanCopier这类基于字节码的属性拷贝工具生成firstPart,这类工具不走序列化流程,性能远好于SerializationUtils.clone,但还是比前两种方案差一点,非必要不优先选。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:12:40