java深拷贝的三种方式

您所在的位置:网站首页 3d中复制的三种方式是什么 java深拷贝的三种方式

java深拷贝的三种方式

2024-07-10 18:52| 来源: 网络整理| 查看: 265

问题:spring boot/JPA项目中,修改某个对象以后需要生成一个VO对象给客户端,数据库对应的POJO对象里有个Map类型的对象(名字叫para),这个对象的value又是个Map,我使用Map的putAll()方法拷贝了一份para,然后修改里面的值,最后发现para的内容也被修改了。示例代码如下:

this.para.putAll(po.getPara()); // fields是para下面的一个Map参数,此处本意是返回给客户端的fields元素中不包含aaa和bbb两个字段 List fields = (List)this.para.get("fields"); fields.forEach(item -> { item.remove("aaa"); item.remove("bbb"); });

以上代码出现的问题是,返回给界面的VO中确实没有了aaa和bbb两个字段,但不幸的是,对应数据库中的fields中也没有了这两个字段,这不是期望的。

原因:map的putAll实现的是浅拷贝。

解决方法:实现深拷贝,有三种方式:

手动赋值,效率高,但代码过于啰嗦。序列化与反序列化,使用SerializationUtils的clone(Object obj)方法,要求拷贝的对象实现了Serializable,Map不行,使用HashMap即可。用fastjson从Object转成json,然后转回object,本质上是反射: private Object deepCopyByJson(Object obj) { String json = JSON.toJSONString(obj); return JSON.parseObject(json, Object.class); }

具体使用哪种方法视具体场景而定,我解决这个问题用的是SerializationUtils,性能要求不高的情况下代码简洁也很重要。

解决方式:

        

this.para = (Map) SerializationUtils.clone((HashMap)po.getPara());

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3