加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

腾讯工作近十年大佬:不是我打击你!你可能真的不会写Java

发布时间:2019-07-01 19:12:57 所属栏目:建站 来源:程序员小姐
导读:文章核心 其实,本不想把标题写的那么恐怖,只是发现很多人干了几年 Java 以后,都自认为是一个不错的 Java 程序员了,可以拿着上万的工资都处宣扬自己了,写这篇文章的目的并不是嘲讽和我一样做 Java 的同行们,只是希望读者看到此篇文章后,可以和我一样

不知道在看完这段代码之后,读者有是否发现还有其他问题的存在,作为一个优秀的 Java 程序员,请看一下这段我们刚刚抽象完的代码:

  1. User user = new UserInputDTOConvert().convert(userInputDTO); 

你会发现,new 这样一个 DTO 转化对象是没有必要的,而且每一个转化对象都是由在遇到 DTO 转化的时候才会出现,那我们应该考虑一下,是否可以将这个类和 DTO 进行聚合呢,看一下我的聚合结果:

  1. public class UserInputDTO { 
  2. private String username; 
  3. private int age; 
  4.  public String getUsername() { 
  5.  return username; 
  6.  } 
  7.  public void setUsername(String username) { 
  8.  this.username = username; 
  9.  } 
  10.  public int getAge() { 
  11.  return age; 
  12.  } 
  13.  public void setAge(int age) { 
  14.  this.age = age; 
  15.  } 
  16.  public User convertToUser(){ 
  17.  UserInputDTOConvert userInputDTOConvert = new UserInputDTOConvert(); 
  18.  User convert = userInputDTOConvert.convert(this); 
  19.  return convert; 
  20.  } 
  21.  private static class UserInputDTOConvert implements DTOConvert<UserInputDTO,User> { 
  22.  @Override 
  23.  public User convert(UserInputDTO userInputDTO) { 
  24.  User user = new User(); 
  25.  BeanUtils.copyProperties(userInputDTO,user); 
  26.  return user; 
  27.  } 
  28.  } 

然后 API 中的转化则由:

  1. User user = new UserInputDTOConvert().convert(userInputDTO); 
  2. User saveUserResult = userService.addUser(user); 

变成了:

  1. User user = userInputDTO.convertToUser(); 
  2. User saveUserResult = userService.addUser(user); 

我们再 DTO 对象中添加了转化的行为,我相信这样的操作可以让代码的可读性变得更强,并且是符合语义的。

再查工具类

再来看 DTO 内部转化的代码,它实现了我们自己定义的 DTOConvert 接口,但是这样真的就没有问题,不需要再思考了吗?

我觉得并不是,对于 Convert 这种转化语义来讲,很多工具类中都有这样的定义,这中 Convert 并不是业务级别上的接口定义,它只是用于普通 bean 之间转化属性值的普通意义上的接口定义,所以我们应该更多的去读其他含有 Convert 转化语义的代码。

我仔细阅读了一下 GUAVA 的源码,发现了 com.google.common.base.Convert 这样的定义:

  1. public abstract class Converter<A, B> implements Function<A, B> { 
  2.  protected abstract B doForward(A a); 
  3.  protected abstract A doBackward(B b); 
  4.  //其他略 

从源码可以了解到,GUAVA 中的 Convert 可以完成正向转化和逆向转化,继续修改我们 DTO 中转化的这段代码:

  1. private static class UserInputDTOConvert implements DTOConvert<UserInputDTO,User> { 
  2.  @Override 
  3.  public User convert(UserInputDTO userInputDTO) { 
  4.  User user = new User(); 
  5.  BeanUtils.copyProperties(userInputDTO,user); 
  6.  return user; 
  7.  } 

修改后:

  1. private static class UserInputDTOConvert extends Converter<UserInputDTO, User> { 
  2.  @Override 
  3.  protected User doForward(UserInputDTO userInputDTO) { 
  4.  User user = new User(); 
  5.  BeanUtils.copyProperties(userInputDTO,user); 
  6.  return user; 
  7.  } 
  8.  @Override 
  9.  protected UserInputDTO doBackward(User user) { 
  10.  UserInputDTO userInputDTO = new UserInputDTO(); 
  11.  BeanUtils.copyProperties(user,userInputDTO); 
  12.  return userInputDTO; 
  13.  } 
  14.  } 

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读