• BeanUtils.copyProperties:曾经是我的女神,现在是我的毒药。


    前言

    BeanUtils.copyProperties十有八九是你这些年工作中用的很多的其中一个,不管是Apache的还是Spring的。

    网上的解释浩如烟海,我这边用一个超简单的例子直观展示给你看。

    以后就记住了,能不用就不用。

    正文

    1、网上的解释

    我收纳了几个网上最典型的解释,也就是这个工具类的缺点,可以先回顾一下。

    大致如下:

    1、只能浅拷贝,简单理解就是只复制的引用,没复制对象内容;

    2、名称和类型要匹配,不匹配的属性会复制失败;

    3、性能一般,因为用了反射机制。

    这里面,其实对于我们来讲,这个工具好不好用,理解第2点就足够了。

    2、名称不匹配

    假设一个user对象,有个属性是手机号,那么我们看看使用BeanUtils后是什么效果。

    这是原对象,定义联系方式是telePhone。

    image

    然后我们定义一个接收拷贝的对象

    image

    使用BeanUtils.copyProperties拷贝后效果如下:

    image

    可以看到,因为名称少了一个字母,所以拷贝后联系方式是null。

    如果是返回给前端的接口数据,字段又多,这样的问题会耽误你不少时间。

    3、类型不匹配

    我们再换个测试方式,原对象有个age属性是String类型。

    image

    而接收拷贝的对象,因为你的同事偷懒,误以为不是String,就给个Integer类型。

    image

    看看效果,不会报错。

    image

    但是age也是null,没有复制成功。

    4、如果遇到猪队友

    其实上面两个就是典型的缺点了,那我们如果再极端点,假设你某天遇到了猪队友。

    你们有一个类型是金额,原对象类型是BigDecimal。

    image

    而猪队友自己创建了一个VO,给你来个double类型,你觉得会报错吗?

    image

    假如这个金额传的还挺大

    image

    看下效果

    image

    玛德,直接钱没了,你完了。

    5、我怎么用的

    工作这么多年,上面的坑我基本都踩过,有些是我踩别人的。

    所以我挺早就开始像下面这么用了,返璞归真了。

    image

    没错,直接用IDEA的插件自动生成setter,然后写值。

    什么BeanUtils,什么MapStruct,什么ModelMapper,都再见!

    灵活,可控,直观,性能还好,字段多也多不到哪里去,中小企业的最佳选择。

    总结

    我所在的互联网公司,从前年开始就已经禁止使用BeanUtils.copyProperties了,因为坑了太多队友。

    有段时间也有项目用MapStruct,但是当映射变得复杂时,配置也相应复杂起来,而且错误信息有时会不清晰。

    所以最终我们还是返璞归真了,用插件简化映射,人工赋值,降低维护难度,已被列入了公司的编程规范。

    君子,不立于危墙之下,看得见摸得着的心里才踏实。


    喜欢就点赞关注↓↓↓,更多干货持续输出。


    __EOF__

  • 本文作者: 程序员济癫
  • 本文链接: https://www.cnblogs.com/fulongyuanjushi/p/17678455.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    【线程的重要性】【线程和进程的区别】【多线程的运行优势,对比运行时间System.nanoTime();】
    STM32学习之Keil5软件配置
    leetcode - 42. Trapping Rain Water
    宏观角度认识递归之 Pow(x,n) 问题
    Nautilus无法创建下列所需的文件夹:/home/user/Desktop 报错解决
    chatGPT教你算法(1)——常用的排序算法
    spring cloud与加密库jasypt(ulisesbocchio)冲突问题定位
    带你走进脚本世界,ijkplayer之【init-ios.sh】脚本分析
    图像对比度增强
    Linux centos安装SQL Server数据库,结合cpolar内网穿透实现公网访问
  • 原文地址:https://www.cnblogs.com/fulongyuanjushi/p/17678455.html