V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhiyu1998
V2EX  ›  Java

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

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

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