前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自制CopyUtil优雅封装BeanUtils

自制CopyUtil优雅封装BeanUtils

作者头像
甲蛙全栈
发布2020-12-02 09:57:39
9630
发布2020-12-02 09:57:39
举报
文章被收录于专栏:Java全栈

本期为大家带来一个实用的对象复制工具类CopyUtil,优雅封装BeanUtils

喜欢听我叨叨的,直接看视频

制作CopyUtil优雅封装BeanUtils

01 场景介绍

通常情况下,一个项目会有很多的分层,比如经典的三层controller, server, mapper(dao)

在这些层之间传输数据,需要用到各种实体类,叫法不一,比如VO, DTO, ENTITY, DOMAIN等。所以,经常需要将数据从一个实体复制到另一个实体

02 最笨的方法

最笨的方法,当然就是一个一个set,花点力气,代码量多点,但是没有性能问题,如下:

代码语言:javascript
复制
// 功能:将UserDto数据拷贝到User,userDto是已有的变量
User user = new User();
user.setId(userDTO.getId());
user.setName(userDTO.getName());
user.set...

小提示:IDEA有个插件:GenerateAllSetter,可以快速生成一堆set

盗个图了:

03 使用BeanUtils

如果嫌一个一个的set麻烦,那么可以用BeanUtils。

Spring框架内置了一个BeanUtils工具类,可以实现对象的拷贝。

  • 优点:简单实用
  • 缺点:用到了反射,牺牲一点点性能,不是阿里那种体量的可以忽略

基本用法如下,是不是比最笨的set简洁多了:

代码语言:javascript
复制
// 功能:将UserDto数据拷贝到User,userDto是已有的变量
User user = new User();
BeanUtils.copyProperties(userDto, user);

如果是列表的复制,则循环调用copyProperties,看起来有点麻烦!用法如下:

代码语言:javascript
复制
// 功能:将List<UserDto>数据拷贝到List<User>,userDtoList是已有的变量
List<User> userList = new ArrayList<>();
for (int i = 0, l = userDtoList.size(); i < l; i++) {
    UserDto userDto = userDtoList.get(i);
    User user = new User();
    BeanUtils.copyProperties(userDto, user);
    userList.add(user);
}

除了广为人知的copyProperties用法外,还有其它关于类方法、属性的一些操作,具体就不演示,看方法名就知道了

04 自制CopyUtil

上面的BeanUtils写法还不够简洁,特别是列表复制,所以我自制了一个CopyUtil工具类,封装了BeanUtil,用起来超级简单,如下

  • 优点:更简单实用
  • 缺点:用到了反射,牺牲一点点性能,不是阿里那种体量的可以忽略

源码如下:

代码语言:javascript
复制
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 公众号:甲蛙全栈,专注Java全栈技术分享
 * @author 甲蛙
 */
public class CopyUtil {

    /**
     * 对象复制
     */
    public static <T> T copy(Object source, Class<T> clazz) {
        if (source == null) {
            return null;
        }
        T obj = null;
        try {
            obj = clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        BeanUtils.copyProperties(source, obj);
        return obj;
    }

    /**
     * 列表复制
     */
    public static <T> List<T> copyList(List source, Class<T> clazz) {
        List<T> target = new ArrayList<>();
        if (!CollectionUtils.isEmpty(source)){
            for (Object c: source) {
                T obj = copy(c, clazz);
                target.add(obj);
            }
        }
        return target;
    }
}

05 使用示例

对象复制:

代码语言:javascript
复制
// 功能:将UserDto数据拷贝到User,userDto是已有的变量

// BeanUtils需要两行:
User user = new User();
BeanUtils.copyProperties(userDto, user);

// CopyUtil,只要一行:
User user = CopyUtil.copy(userDto, User.class);

列表复制:

代码语言:javascript
复制
// 功能:将List<UserDto>数据拷贝到List<User>,userDtoList是已有的变量

// BeanUtils需要好几行:
List<User> userList = new ArrayList<>();
for (int i = 0, l = userDtoList.size(); i < l; i++) {
    UserDto userDto = userDtoList.get(i);
    User user = new User();
    BeanUtils.copyProperties(userDto, user);
    userList.add(user);
}

// CopyUtil,只要一行:
List<User> userList = CopyUtil.copyList(userDtoList, User.class);

06 高频面试题

Q:你做过的项目中,有没有用过泛型,怎么使用的?

A:泛型经常用来写一些通用的类,比如工具类,上面提到的CopyUtil,或是一些数据实体类,用来存放一些不确实类型的数据。

Q:泛型和Object用法上有什么区别?

A:如果将泛型改为Object,则在使用这个工具类时,需要强制类型转换,有兴趣的可以试试。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/12/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01 场景介绍
  • 02 最笨的方法
  • 03 使用BeanUtils
  • 04 自制CopyUtil
  • 05 使用示例
  • 06 高频面试题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档