大家在公司都是怎么深拷贝/浅拷贝实体类的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
zhiyu1998
V2EX    Java

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

  •  
  •   zhiyu1998
    zhiyu1998 Oct 16, 2022 6171 views
    This topic created in 1289 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     1276 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 59ms UTC 17:36 PVG 01:36 LAX 10:36 JFK 13:36
    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