大家在公司都是怎么深拷贝/浅拷贝实体类的?

2022-10-16 12:25:36 +08:00
 zhiyu1998
像是我在的公司一般就用 Spring 的 BeanUtils 和 Apache 的工具类进行 copy ,不知道大家有没有高效或者更好的扩展方法进行 VO DTO 这些转换?
5247 次点击
所在节点    Java
32 条回复
zhiyu1998
2022-10-16 22:36:15 +08:00
@wolfie 可以 这个优点爱了 哈哈哈
xuanbg
2022-10-17 08:27:02 +08:00
有像我一样从来不用浅拷贝的么?

深拷贝我和#6 一样,简单粗暴序列化+反序列化。这样不但能深拷贝,还可以转换任意复杂类型呢。好用得一逼!
tedzhou1221
2022-10-17 09:13:43 +08:00
@mikicomo 你们使用 kryo 时,序列化的对象里有个添加字段,依赖这个对象的服务需要重启吗?
yule111222
2022-10-17 10:03:12 +08:00
不用这些,一律手写,可以避免很多问题
如果 2 个对象结构一模一样,明显存在设计问题
chg87599671
2022-10-17 11:02:26 +08:00
idea plugin : GenerateAllSetter
zhiyu1998
2022-10-17 11:09:41 +08:00
@chg87599671 感谢推荐 虽然这个已经是很久以前的插件了 哈哈哈
zhiyu1998
2022-10-17 11:09:58 +08:00
@yule111222 这个确实应该考虑下
mikicomo
2022-10-17 11:10:15 +08:00
@tedzhou1221 #23 场景不一样,我们深拷贝的都是内部使用的中间变量,提供给外部的实体是另一套,并不会使用深拷贝
RedBeanIce
2022-10-17 13:05:06 +08:00
自己写 getset ,通过插件配合。
oldshensheep
2022-10-17 16:37:26 +08:00
MapStruct 用了就回不去了,转换对象只用写一个接口……代码自动生成。性能是最好的,和自己写 GetSet 是一样的。
oldshensheep
2022-10-17 16:51:14 +08:00
spring 的那个速度也还可以,主要用它可以不用写代码……可以偷懒,但是它比 MapStruct 慢了一个数量级差不多,我现在都是使用的 MapStruct 。
MapStruct 拓展性也比较好,你可以自定义转换代码,可以在转换后完成一些操作等等。
如果你要定义一个 User 转换器

@Mapper
public interface UserMapper {
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
UserVo toUserVo(User user);

}

然后 var userVO = UserMapper .INSTANCE .toUserVo(user) 就可以转换完成

各种 DTO 转换器速度的比较
https://zhuanlan.zhihu.com/p/420054993
zhiyu1998
2022-10-17 19:31:16 +08:00
@oldshensheep 心动了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/887276

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX