zhiyu1998
V2EX  ›  Java

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

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

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