| 不知道在看完这段代码之后,读者有是否发现还有其他问题的存在,作为一个优秀的 Java 程序员,请看一下这段我们刚刚抽象完的代码: User user = new UserInputDTOConvert().convert(userInputDTO); 
 你会发现,new 这样一个 DTO 转化对象是没有必要的,而且每一个转化对象都是由在遇到 DTO  转化的时候才会出现,那我们应该考虑一下,是否可以将这个类和 DTO 进行聚合呢,看一下我的聚合结果: public class UserInputDTO { private String username; private int age;  public String getUsername() {  return username;  }  public void setUsername(String username) {  this.username = username;  }  public int getAge() {  return age;  }  public void setAge(int age) {  this.age = age;  }  public User convertToUser(){  UserInputDTOConvert userInputDTOConvert = new UserInputDTOConvert();  User convert = userInputDTOConvert.convert(this);  return convert;  }  private static class UserInputDTOConvert implements DTOConvert<UserInputDTO,User> {  @Override  public User convert(UserInputDTO userInputDTO) {  User user = new User();  BeanUtils.copyProperties(userInputDTO,user);  return user;  }  } } 
 然后 API 中的转化则由: User user = new UserInputDTOConvert().convert(userInputDTO); User saveUserResult = userService.addUser(user); 
 变成了: User user = userInputDTO.convertToUser(); User saveUserResult = userService.addUser(user); 
 我们再 DTO 对象中添加了转化的行为,我相信这样的操作可以让代码的可读性变得更强,并且是符合语义的。 再查工具类 再来看 DTO 内部转化的代码,它实现了我们自己定义的 DTOConvert 接口,但是这样真的就没有问题,不需要再思考了吗? 我觉得并不是,对于 Convert 这种转化语义来讲,很多工具类中都有这样的定义,这中 Convert 并不是业务级别上的接口定义,它只是用于普通  bean 之间转化属性值的普通意义上的接口定义,所以我们应该更多的去读其他含有 Convert 转化语义的代码。 我仔细阅读了一下 GUAVA 的源码,发现了 com.google.common.base.Convert 这样的定义: public abstract class Converter<A, B> implements Function<A, B> {  protected abstract B doForward(A a);  protected abstract A doBackward(B b);  //其他略 } 
 从源码可以了解到,GUAVA 中的 Convert 可以完成正向转化和逆向转化,继续修改我们 DTO 中转化的这段代码: private static class UserInputDTOConvert implements DTOConvert<UserInputDTO,User> {  @Override  public User convert(UserInputDTO userInputDTO) {  User user = new User();  BeanUtils.copyProperties(userInputDTO,user);  return user;  } } 
 修改后: private static class UserInputDTOConvert extends Converter<UserInputDTO, User> {  @Override  protected User doForward(UserInputDTO userInputDTO) {  User user = new User();  BeanUtils.copyProperties(userInputDTO,user);  return user;  }  @Override  protected UserInputDTO doBackward(User user) {  UserInputDTO userInputDTO = new UserInputDTO();  BeanUtils.copyProperties(user,userInputDTO);  return userInputDTO;  }  } 
 (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |