zhiyu1998
V2EX  ›  Java

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

  •  
  •   zhiyu1998 ·
    zhiyu1998 · Oct 16, 2022 · 6829 views
    This topic created in 1479 days ago, the information mentioned may be changed or developed.
    像是我在的公司一般就用 Spring 的 BeanUtils 和 Apache 的工具类进行 copy ,不知道大家有没有高效或者更好的扩展方法进行 VO DTO 这些转换?
    32 replies  •  2022-10-17 19:31:16 +08:00
    OrangeAdd
    OrangeAdd
    Oct 16, 2022
    1
    可以看下 mapstruct
    zhiyu1998
    zhiyu1998
    OP
    Oct 16, 2022
    2
    @OrangeAdd !!这个我倒是看公众号经常有推荐 但是会不会项目加进去忽然用起来就有点别扭
    HinkLeung
    HinkLeung
    Oct 16, 2022
    3
    @zhiyu1998 #2 不会啊,用着挺方便的
    zhiyu1998
    zhiyu1998
    OP
    Oct 16, 2022
    4
    @HinkLeung ok mark 住了
    optional
    optional
    Oct 16, 2022
    5
    mapstruct+1
    dreamlike
    dreamlike
    Oct 16, 2022 via Android
    6
    深拷贝 我就比较弱智 我先序列化 json 然后反序列化
    浅拷贝 我靠 vo2dto 这个插件搞的 基本走编码时代码生成的路子 出问题好查
    bthulu
    bthulu
    Oct 16, 2022
    7
    IDE 自动生成 clone 方法啊, 你难道用反射? 那你还怎么用 GraalVM
    zhiyu1998
    zhiyu1998
    OP
    Oct 16, 2022
    8
    @dreamlike 浅拷贝我也有这个插件,哈哈哈,但是有时候懒得写就直接 BeanUtils 了,可以查问题这个学到了!
    zhiyu1998
    zhiyu1998
    OP
    Oct 16, 2022
    9
    @bthulu 实现 Cloneable 吗?
    Red998
    Red998
    Oct 16, 2022❤️4
    10
    Apache 这个性能有点低 。推荐插件吧 https://plugins.jetbrains.com/plugin/18264-beanmappingkey
    深拷贝:new 一个全新对象 set 最稳
    shelken
    shelken
    Oct 16, 2022 via iPhone❤️1
    11
    @redorblacck886 感谢,前两周写的时候就在找有没有自动 builder 相同字段名字转换的,要不然一个一个手打对应字段太难受了
    ConnorTomato
    ConnorTomato
    Oct 16, 2022❤️1
    12
    BeanMappingKey + 1 ,是一个 V2 小伙伴写的。自动 get set ,一目了然,绝不可能出错。
    BeanUtils 有各种坑, 曾经遇到一个坑是 RPC 调用的时候,序列化报错。
    zhiyu1998
    zhiyu1998
    OP
    Oct 16, 2022 via iPhone
    13
    @redorblacck886 我超 这个 new bee
    silencil
    silencil
    Oct 16, 2022 via iPhone
    14
    也是用 mapstruct
    Red998
    Red998
    Oct 16, 2022
    15
    @shelken 嗯 用工具类浅拷贝 虽然方便其实还是反射调用。虽然性能在调用次数其实差不多。但是 set 最快也最稳
    哪里有问题一目了然。缺点代码多
    wolfie
    wolfie
    Oct 16, 2022
    17
    mapstruct
    编译期处理,速度快、有问题反编译就能看到原因。
    billly
    billly
    Oct 16, 2022
    18
    直接用插件生成方法,简单高效
    zhiyu1998
    zhiyu1998
    OP
    Oct 16, 2022
    19
    @billly 就是写起来有点臃肿
    zhiyu1998
    zhiyu1998
    OP
    Oct 16, 2022
    20
    @mikicomo 这个还真没用过
    zhiyu1998
    zhiyu1998
    OP
    Oct 16, 2022
    21
    @wolfie 可以 这个优点爱了 哈哈哈
    xuanbg
    xuanbg
    Oct 17, 2022
    22
    有像我一样从来不用浅拷贝的么?

    深拷贝我和#6 一样,简单粗暴序列化+反序列化。这样不但能深拷贝,还可以转换任意复杂类型呢。好用得一逼!
    tedzhou1221
    tedzhou1221
    Oct 17, 2022
    23
    @mikicomo 你们使用 kryo 时,序列化的对象里有个添加字段,依赖这个对象的服务需要重启吗?
    yule111222
    yule111222
    Oct 17, 2022
    24
    不用这些,一律手写,可以避免很多问题
    如果 2 个对象结构一模一样,明显存在设计问题
    aooooobaibai
    aooooobaibai
    Oct 17, 2022
    25
    idea plugin : GenerateAllSetter
    zhiyu1998
    zhiyu1998
    OP
    Oct 17, 2022 via iPhone
    26
    @chg87599671 感谢推荐 虽然这个已经是很久以前的插件了 哈哈哈
    zhiyu1998
    zhiyu1998
    OP
    Oct 17, 2022 via iPhone
    27
    @yule111222 这个确实应该考虑下
    mikicomo
    mikicomo
    Oct 17, 2022
    28
    @tedzhou1221 #23 场景不一样,我们深拷贝的都是内部使用的中间变量,提供给外部的实体是另一套,并不会使用深拷贝
    RedBeanIce
    RedBeanIce
    Oct 17, 2022
    29
    自己写 getset ,通过插件配合。
    oldshensheep
    oldshensheep
    Oct 17, 2022
    30
    MapStruct 用了就回不去了,转换对象只用写一个接口……代码自动生成。性能是最好的,和自己写 GetSet 是一样的。
    oldshensheep
    oldshensheep
    Oct 17, 2022❤️3
    31
    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
    zhiyu1998
    OP
    Oct 17, 2022 via iPhone
    32
    @oldshensheep 心动了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5061 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 87ms · UTC 07:58 · PVG 15:58 · LAX 23:58 · JFK 02:58
    ♥ Do have faith in what you're doing.