文章地址:你见过哪些目瞪口呆的 Java 代码技巧? (qq.com)
摘要
《你见过哪些目瞪口呆的 Java 代码技巧?》 摘要如下:
📔 一句话总结
Java程序员应该写Java,使用不同的开发工具,包括DTO对象转化和使用lombok来简化代码。
📖 文章摘要
1. 作者强调了Java程序员应该写Java,并强调了更换IDE的重要性。
2. 作者提到了Java程序员应该使用不同的开发工具,如Java包名、domain包名、DTO数据传输和DTO对象转化过程。
3. 作者强调了在移动端API设计中使用DTO对象才能更好地理解和处理Java代码,并介绍了DTO对象的定义和转化过程。
4. 作者提到了使用浅拷贝或深拷贝的Utils来重构和优化代码,并介绍了使用Springframework.beans.BeanUtils#copyProperties对代码进行重构和优化的方法。
5. 作者介绍了抽象接口定义的概念,以及使用泛型来进行抽象接口,并介绍了接口实现的实现类。
原文共 9234 字,阅读需要约21分钟,思维导图、金句 等 点此查看
#知我AI
学到了什么?
1、抽象接口定义
实现com.google.common.base.Convert接口来做DTO转换。UserDTOConvert做为静态子类放在DTO下。
public class UserDTO {
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(){
UserDTOConvert userDTOConvert = new UserDTOConvert();
User convert = userDTOConvert.convert(this);
return convert;
}
public UserDTO convertFor(User user){
UserDTOConvert userDTOConvert = new UserDTOConvert();
UserDTO convert = userDTOConvert.reverse().convert(user);
return convert;
}
private static class UserDTOConvert extends Converter<UserDTO, User> {
@Override
protected User doForward(UserDTO userDTO) {
User user = new User();
BeanUtils.copyProperties(userDTO,user);
return user;
}
@Override
protected UserDTO doBackward(User user) {
UserDTO userDTO = new UserDTO();
BeanUtils.copyProperties(user,userDTO);
return userDTO;
}
}
}
2、断言异常
平时开发时没用到断言异常,学到了AssertionError
private static class UserDTOConvert extends Converter<UserDTO, User> {
@Override
protected User doForward(UserDTO userDTO) {
User user = new User();
BeanUtils.copyProperties(userDTO,user);
return user;
}
@Override
protected UserDTO doBackward(User user) {
throw new AssertionError("不支持逆向转化方法!");
}
}
还有:如何优雅的设计 Java 异常(http://dw-z.ink/1Tak-)
3、对于脏数据的产生一定是致命
听人劝,吃饱饭。做好API验证,再小的脏数据也有可能找几个通宵!
4、JSR303验证
这个在学习谷粒商城时有提到到,那里通过spring框架提供的@Validated进行传输验证,有分组验证,还有统一异常处理等
这里文章说 hibernate 提供的 jsr 303 实现不错,让读者自己去学,留着有空去看看
http://lrwinx.github.io/2016/04/28/%E5%A6%82%E4%BD%95%E4%BC%98%E9%9B%85%E7%9A%84%E8%AE%BE%E8%AE%A1java%E5%BC%82%E5%B8%B8/
5、bean 中的链式风格
关于链式处理bean,之前学过@Builder。文中使用lombok 的@Accessors(chain = true)。
6、静态构造方法
文中说:静态构造方法的语义和简化程度真的高于直接去 new 一个对象
比如创建给map,通过MapUtils.newHashMap()。
业务举例
@Accessors(chain = true)
@Setter
@Getter
@RequiredArgsConstructor(staticName = "of")
public class Student {
@NonNull private String name;
private int age;
}
使用
Student student = Student.of("zs").setAge(24);
有链式,有静态构造,必传构造方式,good!
7、lomok的代理注解@Delegate
@AllArgsConstructor
public abstract class FilterRestTemplate implements RestOperations {
@Delegate
protected volatile RestTemplate restTemplate;
}
```java
public class ExtractRestTemplate extends FilterRestTemplate {
private RestTemplate restTemplate;
public ExtractRestTemplate(RestTemplate restTemplate) {
super(restTemplate);
this.restTemplate = restTemplate;
}
public <T> RestResponseDTO<T> postForEntityWithNoException(String url, Object request, Class<T> responseType, Object... uriVariables)
throws RestClientException {
RestResponseDTO<T> restResponseDTO = new RestResponseDTO<T>();
ResponseEntity<T> tResponseEntity;
try {
tResponseEntity = restTemplate.postForEntity(url, request, responseType, uriVariables);
restResponseDTO.setData(tResponseEntity.getBody());
restResponseDTO.setMessage(tResponseEntity.getStatusCode().name());
restResponseDTO.setStatusCode(tResponseEntity.getStatusCodeValue());
}catch (Exception e){
restResponseDTO.setStatusCode(RestResponseDTO.UNKNOWN_ERROR);
restResponseDTO.setMessage(e.getMessage());
restResponseDTO.setData(null);
}
return restResponseDTO;
}
}
使用spring的RestTemplate时会抛出非 http 状态码。对此进行封装。
并且在封装过程中@Delegate优化代码。不然和下面一样恶心。
public abstract class FilterRestTemplate implements RestOperations {
protected volatile RestTemplate restTemplate;
protected FilterRestTemplate(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@Override
public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables) throws RestClientException {
return restTemplate.getForObject(url,responseType,uriVariables);
}
@Override
public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
return restTemplate.getForObject(url,responseType,uriVariables);
}
@Override
public <T> T getForObject(URI url, Class<T> responseType) throws RestClientException {
return restTemplate.getForObject(url,responseType);
}
@Override
public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables) throws RestClientException {
return restTemplate.getForEntity(url,responseType,uriVariables);
}
//其他实现代码略。。。
}
8、其它
开发时,把代码又状态模式改为策略模式?
做一名优秀的 Java 程序员,至少学会这两种 UML 图:类图,时序图。
鸟哥的《Linux私房菜》