朵小喵儿|七种对象复制工具类,你最看好哪个?
作 者: 鸭血粉丝
原文链接:
日常编程中 , 我们会经常会碰到对象属性复制的场景 , 就比如下面这样一个常见的三层 MVC 架构 。
当我们在上面的架构下编程时 , 我们通常需要经历对象转化 , 比如业务请求流程经历三层机构后需要把它DTO 转为DO然后在数据库中保存 。
当需要从数据查询数据页面展示时 , 查询数据经过三层架构将会从 DO 转为 DTO , 最后再转为 VO , 然后在页面中展示 。
当业务简单的时候 , 我们手写代码 , 通过 getter/setter复制对象属性 , 十分简单 。 但是一旦业务变得复杂 , 对象属性变得很多 , 呢么手写代码就会成为程序员的噩梦 。
不但手写十分繁琐 , 非常耗时间 , 在且还可能容易出错 。
阿粉之前就经历过一个项目 , 一个对象中大概有四五十个字段属性 , 呢时候阿粉还刚入门 , 什么都不太懂 , 写了半天 getter/setter复制对象属性 。
话外音:一个对象属性这么多 , 显然是不太合理的 , 我们设计过程应该将其拆分 。
直到后来 , 阿粉了解到了对象属性复制工具类 , 使用之后 , 发现是真相 , 再也不用手写代码 。 再后来 , 碰到越来越多工具类 , 虽然核心功能都是一样的 , 但是还是存在很多差异 。 新手看到可能会一脸懵逼 , 不知道如何选择 。
所以阿粉今天这篇介绍一下市面上常用的工具类:
- Apache BeanUtils
- Spring BeanUtils
- Cglib BeanCopier
- Dozer
- orika
- MapStruct
- 基本属性复制 , 这个是基本功能
- 不同类型的属性赋值 , 比如基本类型于其包装类型等
- 不同字段名属性赋值 , 当然字段名应该尽量保持一致 , 但是实际业务中 , 由于不同开发人员 , 或者笔误拼错单词 , 这些原因都可能导致会字段名不一致的情况
- 浅拷贝/深拷贝 , 浅拷贝会引用同一对象 , 如果稍微不慎 , 同时改动对象 , 就会踩到意想不到的坑
画外音:公号内回复「20200822」获取源码
Apache BeanUtils首先介绍是第一位应该是 Java 领域属性复制的最有名的工具类「Apache BeanUtils」 , 这个工具类想必很多人或多或少用过或者见过 。
没用过也没关系 , 我们来展示这个类的用法 , 用法非常简单 。
首先我们引入依赖 , 这里使用最新版本:
commons-beanutils commons-beanutils1.9.4 假设我们项目中有如下类:StudentDTO studentDTO = new StudentDTO();studentDTO.setName("阿粉");studentDTO.setAge(18);studentDTO.setNo("6666");List subjects = new ArrayList<>();subjects.add("math");subjects.add("english");studentDTO.setSubjects(subjects);studentDTO.setCourse(new Course("CS-1"));studentDTO.setCreateDate("2020-08-08");StudentDO studentDO = new StudentDO();BeanUtils.copyProperties(studentDO, studentDTO);不过 , 上面的代码如果你这么写 , 我们会碰到第一个问题 , BeanUtils 默认不支持 String转为 Date 类型 。
推荐阅读
- 朵小喵儿|2021年迎来考验,美国企业或将再次入局,国产手机
- 朵小喵儿|国产手机,2021年迎来考验,美国企业或将再次入局
- 朵小喵儿|突破旗舰封锁,魅族今年性能旗舰亮新玩法,销量真稳了
- 朵小喵儿|小天才手表背后,是成人世界的焦虑
- 朵小喵儿|主板维修必备!海量主板电路图+CPU程序下载
- 朵小喵儿|如何成为制造大国?曹德旺一语中的:先把“这个”取消再说
- 朵小喵儿|蔚来总部临时办公大楼预计下月启用 位于合肥经开区
- 朵小喵儿|腾讯AI Lab高级研究员宋林峰:图到文本生成任务中的通用型图结构信息保存法
- 朵小喵儿|突发!特朗普政府考虑将国内最大芯片制造商中芯国际列入贸易黑名单
- 朵小喵儿|硬件捡垃圾33期
