好文学习(一) java技巧

文章地址:你见过哪些目瞪口呆的 Java 代码技巧? (qq.com) 摘要 《你见过哪些目瞪口呆的 Java 代码技巧?》 摘要如下: 📔 一句话总结 Java程序员应该写Java,使用不同的开发工具,包括DTO对象转化和使用lombok来简化代码。 📖 文章摘要 1. 作者强调了Java

文章地址:你见过哪些目瞪口呆的 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私房菜》

LICENSED UNDER CC BY-NC-SA 4.0
Comment