设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 文件
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

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

发布时间:2019-07-01 16:18 所属栏目:21 来源:程序员小姐
导读:这样的 builder 代码,让我是在恶心难受,于是我打算用 lombok 重构这段代码: @Builder publicclassStudent{ privateStringname; privateintage; } 调用方式: Studentstudent=Student.builder().name(zs).age(24)

这样的 builder 代码,让我是在恶心难受,于是我打算用 lombok 重构这段代码:

  1. @Builder 
  2. public class Student { 
  3.  private String name; 
  4.  private int age; 

调用方式:

  1. Student student = Student.builder().name("zs").age(24).build(); 

代理模式

正如我们所知的,在程序中调用 rest 接口是一个常见的行为动作,如果你和我一样使用过 spring 的 RestTemplate,我相信你会我和一样,对他抛出的非 http 状态码异常深恶痛绝。

所以我们考虑将 RestTemplate 最为底层包装器进行包装器模式的设计:

  1. public abstract class FilterRestTemplate implements RestOperations { 
  2.  protected volatile RestTemplate restTemplate; 
  3.  protected FilterRestTemplate(RestTemplate restTemplate){ 
  4.  this.restTemplate = restTemplate; 
  5.  } 
  6.  //实现RestOperations所有的接口 

然后再由扩展类对 FilterRestTemplate 进行包装扩展:

  1. public class ExtractRestTemplate extends FilterRestTemplate { 
  2.  private RestTemplate restTemplate; 
  3.  public ExtractRestTemplate(RestTemplate restTemplate) { 
  4.  super(restTemplate); 
  5.  this.restTemplate = restTemplate; 
  6.  } 
  7.  public <T> RestResponseDTO<T> postForEntityWithNoException(String url, Object request, Class<T> responseType, Object... uriVariables) 
  8.  throws RestClientException { 
  9.  RestResponseDTO<T> restResponseDTO = new RestResponseDTO<T>(); 
  10.  ResponseEntity<T> tResponseEntity; 
  11.  try { 
  12.  tResponseEntity = restTemplate.postForEntity(url, request, responseType, uriVariables); 
  13.  restResponseDTO.setData(tResponseEntity.getBody()); 
  14.  restResponseDTO.setMessage(tResponseEntity.getStatusCode().name()); 
  15.  restResponseDTO.setStatusCode(tResponseEntity.getStatusCodeValue()); 
  16.  }catch (Exception e){ 
  17.  restResponseDTO.setStatusCode(RestResponseDTO.UNKNOWN_ERROR); 
  18.  restResponseDTO.setMessage(e.getMessage()); 
  19.  restResponseDTO.setData(null); 
  20.  } 
  21.  return restResponseDTO; 
  22.  } 

包装器 ExtractRestTemplate 很完美的更改了异常抛出的行为,让程序更具有容错性。在这里我们不考虑 ExtractRestTemplate 完成的功能,让我们把焦点放在 FilterRestTemplate 上,“实现 RestOperations 所有的接口”,这个操作绝对不是一时半会可以写完的,当时在重构之前我几乎写了半个小时,如下:

  1. public abstract class FilterRestTemplate implements RestOperations { 
  2.  protected volatile RestTemplate restTemplate; 
  3.  protected FilterRestTemplate(RestTemplate restTemplate) { 
  4.  this.restTemplate = restTemplate; 
  5.  } 
  6.  @Override 
  7.  public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables) throws RestClientException { 
  8.  return restTemplate.getForObject(url,responseType,uriVariables); 
  9.  } 
  10.  @Override 
  11.  public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException { 
  12.  return restTemplate.getForObject(url,responseType,uriVariables); 
  13.  } 
  14.  @Override 
  15.  public <T> T getForObject(URI url, Class<T> responseType) throws RestClientException { 
  16.  return restTemplate.getForObject(url,responseType); 
  17.  } 
  18.  @Override 
  19.  public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables) throws RestClientException { 
  20.  return restTemplate.getForEntity(url,responseType,uriVariables); 
  21.  } 
  22.  //其他实现代码略。。。 

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读