大家在公司都是怎么深拷贝/浅拷贝实体类的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhiyu1998
V2EX    Java

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

  •  
  •   zhiyu1998
    zhiyu1998 2022-10-16 12:25:36 +08:00 5822 次点击
    这是一个创建于 1102 天前的主题,其中的信息可能已经有所发展或是发生改变。
    像是我在的公司一般就用 Sring 的 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 个对象结构一模一样,明显存在设计问题
    aooooobaibai
        25
    aooooobaibai  
       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   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
       2022-10-17 19:31:16 +08:00 via iPhone
    @oldshensheep 心动了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5328 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 08:18 PVG 16:18 LAX 01:18 JFK 04:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86