V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Sponsored by
LinkedIn
不坐班的神仙工作 · 去任何你想去的地方远程,赚一线城市的工资
2000 个不用出门 Social 的全球远程工作,帮助 V2EX 的小伙伴开启全新的工作方式。
Promoted by LinkedIn
Mrzhs
V2EX  ›  Java

有什么较为通用的办法解决两个实体类传递相同参数?

  •  
  •   Mrzhs ·
    NoString · 58 天前 · 2688 次点击
    这是一个创建于 58 天前的主题,其中的信息可能已经有所发展或是发生改变。

    码不动了,真的

    Picture

    40 条回复    2022-08-05 11:27:39 +08:00
    ppxppx
        1
    ppxppx  
       58 天前 via Android
    BeanUtils.CopyProperties?
    hidemyself
        2
    hidemyself  
       58 天前
    BeanUtils 吧。。或者 MapStruct
    Mrzhs
        3
    Mrzhs  
    OP
       58 天前
    @ppxppx 我去试试
    Mrzhs
        4
    Mrzhs  
    OP
       58 天前
    @hidemyself 感谢
    dake0805
        5
    dake0805  
       58 天前
    我是用 IDEA 插件 https://github.com/gejun123456/intellij-generateAllSetMethod 生成,然后自己微调
    ligiggy
        6
    ligiggy  
       58 天前
    A 继承 B ?或者继承同一个接口?
    Morii
        7
    Morii  
       58 天前
    MapStruct 写一个 BaseMapper 然后泛型实现
    lazyfighter
        8
    lazyfighter  
       58 天前
    MapStruct
    issakchill
        9
    issakchill  
       58 天前   ❤️ 1
    如果只是一次性使用 推荐 idea 插件 https://plugins.jetbrains.com/plugin/7171-generateo2o
    a33291
        10
    a33291  
       58 天前
    按说 java 应该也有一些基于反射实现的 map 库,类似 automapper 或者 tinymapper 之类的,这种只要 2 个类字段一致(不一致时可通过配置修改,但是很多时候 dto 和 entity 字段是重叠的)只需要调用一个函数即可

    楼上提到的 BeanUtils 也许就是干这事的?对 java 不太熟
    jones2000
        11
    jones2000  
       58 天前
    成员变量太多了, 拆类
    wzcloud
        12
    wzcloud  
       58 天前
    没有代码质量管控的话,直接用 map 呗,反正是后来者维护。
    Vaspike
        13
    Vaspike  
       58 天前
    嫌麻烦的话直接 jackson 序列化第一个对象后填充到第二个对象,楼上各位似乎没提供这种思路,当然可能性能堪忧

    当然我平时是把相同属性放到公共父类,写一个反射的工具方法(网上应该能搜到类似的)
    ye4tar
        14
    ye4tar  
       58 天前
    #13 楼的算是一种套路了,然后这种在 TS 中根本不算啥,
    WispZhan
        15
    WispZhan  
       58 天前
    @jones2000 +1

    然后上 MapStruct
    14104chk
        16
    14104chk  
       58 天前
    可以抽出一个类 A ,里面含有所有的公共属性(多一两个也无所谓),然后组合到 in 和 orderDetl 里面。赋值的时候,直接 in.setA(orderDetl.getA())
    xy90321
        17
    xy90321  
       58 天前 via iPhone
    是有什么深意我没读懂吗?不是一个 Dozer BeanMapper 就解决的事情?
    Leviathann
        18
    Leviathann  
       58 天前
    正则替换一下
    ns09005264
        19
    ns09005264  
       58 天前
    我一般用这种方式,先用插件生成调用 setter 的代码段,配合 vim 的动作录制,快速且有静态检查
    ns09005264
        20
    ns09005264  
       58 天前
    version0
        21
    version0  
       58 天前
    嘿,我以前写过这种代码,当时迷信反射效率低,就手写过这种代码。🤣
    Goooooos
        22
    Goooooos  
       58 天前 via Android
    我一般都是 beanutils.copyproperties
    Saxton
        23
    Saxton  
       58 天前 via iPhone
    果断推荐 mapStruct 强推啊 延长寿命的东西
    Saxton
        24
    Saxton  
       58 天前 via iPhone
    @Vaspike 强推 mapStruct 。。。 非反射 编译自动 生成方法,配合 idea 插件自动补充注解,舒服到上天
    Saxton
        25
    Saxton  
       58 天前 via iPhone
    mapStruct 也有编译检查,字段写错类型不对会提示
    silentsky
        26
    silentsky  
       58 天前 via Android
    如果你用 beanutil ,等有一天改属性的时候你就知道难受,至少这种方式会给你编译报错
    dqzcwxb
        27
    dqzcwxb  
       57 天前
    @version0 #21 虽然但是,反射确实不如手写 set 效率高
    xmumiffy
        28
    xmumiffy  
       57 天前 via Android
    Json encode&decode
    bthulu
        29
    bthulu  
       57 天前
    字段都一样, 你为什么要用两个实体类呢, 吃饱了撑的吗?
    guanhui07
        30
    guanhui07  
       57 天前
    mapStruct
    hahaFck
        31
    hahaFck  
       57 天前
    java 就是实体分的太多了,大量重复的属性。
    koloonps
        32
    koloonps  
       57 天前
    @bthulu 数据库查出来的对象比返回的参数要多
    lyxeno
        33
    lyxeno  
       57 天前
    用 BeanUtils 后续重构好像不太方便,我这种代码现在都是用 Github Copilot 帮忙自动生成的

    然后自己写的时候注意一点,没必要的实体类就不另外新增了,减少这种重复代码
    luomao
        34
    luomao  
       57 天前
    orika
    li24361
        35
    li24361  
       57 天前
    @Saxton 补全插件能发一下吗?
    blackshow
        36
    blackshow  
       57 天前
    MapStruct
    tramm
        37
    tramm  
       57 天前
    mapstruct
    Spring 的 beanutil
    Hutool 的 beanutil...
    bthulu
        38
    bthulu  
       57 天前
    @koloonps 这还不简单, spring 天生支持返回时过滤字段
    ruanimal
        39
    ruanimal  
       56 天前
    @jones2000 没见过几万字段的系统吗
    jones2000
        40
    jones2000  
       56 天前
    @ruanimal 没看出来你这个是什么系统, 不就是一个业务模块嘛。大家都是垒代码的。离做系统还远着呢。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1707 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 615ms · UTC 16:44 · PVG 00:44 · LAX 09:44 · JFK 12:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.