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

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

发布时间:2019-07-01 16:18 所属栏目:21 来源:程序员小姐
导读:仔细看一下 set 方法,这样的设置便是 chain 的 style,调用的时候,可以这样使用: Studentstudent=newStudent() .setAge(24) .setName(zs); 相信合理使用这样的链式代码,会更多的程序带来很好的可读性,那看一下

仔细看一下 set 方法,这样的设置便是 chain 的 style,调用的时候,可以这样使用:

  1. Student student = new Student() 
  2.  .setAge(24) 
  3.  .setName("zs"); 

相信合理使用这样的链式代码,会更多的程序带来很好的可读性,那看一下如果使用 lombok 进行改善呢,请使用 @Accessors(chain = true),看如下代码:

  1. @Accessors(chain = true) 
  2. @Setter 
  3. @Getter 
  4. public class Student { 
  5.  private String name; 
  6.  private int age; 

这样就完成了一个对于 bean 来讲很友好的链式操作。

静态构造方法

静态构造方法的语义和简化程度真的高于直接去 new 一个对象。比如 new 一个 List 对象,过去的使用是这样的:

  1. List<String> list = new ArrayList<>(); 

看一下 guava 中的创建方式:

  1. List<String> list = Lists.newArrayList(); 

Lists 命名是一种约定(俗话说:约定优于配置),它是指 Lists 是 List 这个类的一个工具类,那么使用 List 的工具类去产生 List,这样的语义是不是要比直接 new 一个子类来的更直接一些呢,答案是肯定的,再比如如果有一个工具类叫做 Maps,那你是否想到了创建 Map 的方法呢:

  1. HashMap<String, String> objectObjectHashMap = Maps.newHashMap(); 

好了,如果你理解了我说的语义,那么,你已经向成为 Java 程序员更近了一步了。

再回过头来看刚刚的 Student,很多时候,我们去写 Student 这个 bean 的时候,他会有一些必输字段,比如 Student 中的 name 字段,一般处理的方式是将 name 字段包装成一个构造方法,只有传入 name 这样的构造方法,才能创建一个 Student 对象。

接上上边的静态构造方法和必传参数的构造方法,使用 lombok 将更改成如下写法(@RequiredArgsConstructor 和 @NonNull):

  1. @Accessors(chain = true) 
  2. @Setter 
  3. @Getter 
  4. @RequiredArgsConstructor(staticName = "ofName") 
  5. public class Student { 
  6.  @NonNull private String name; 
  7.  private int age; 

测试代码:

  1. Student student = Student.ofName("zs"); 

这样构建出的 bean 语义是否要比直接 new 一个含参的构造方法(包含 name 的构造方法)要好很多。

当然,看过很多源码以后,我想相信将静态构造方法 ofName 换成 of 会先的更加简洁:

  1. @Accessors(chain = true) 
  2. @Setter 
  3. @Getter 
  4. @RequiredArgsConstructor(staticName = "of") 
  5. public class Student { 
  6.  @NonNull private String name; 
  7.  private int age; 

测试代码:

  1. Student student = Student.of("zs"); 

当然他仍然是支持链式调用的:

  1. Student student = Student.of("zs").setAge(24); 

这样来写代码,真的很简洁,并且可读性很强。

使用 builder

Builder 模式我不想再多解释了,读者可以看一下《Head First》(设计模式) 的建造者模式。

今天其实要说的是一种变种的 builder 模式,那就是构建 bean 的 builder 模式,其实主要的思想是带着大家一起看一下 lombok 给我们带来了什么。

看一下 Student 这个类的原始 builder 状态:

  1. public class Student { 
  2.  private String name; 
  3.  private int age; 
  4.  public String getName() { 
  5.  return name; 
  6.  } 
  7.  public void setName(String name) { 
  8.  this.name = name; 
  9.  } 
  10.  public int getAge() { 
  11.  return age; 
  12.  } 
  13.  public void setAge(int age) { 
  14.  this.age = age; 
  15.  } 
  16.  public static Builder builder(){ 
  17.  return new Builder(); 
  18.  } 
  19.  public static class Builder{ 
  20.  private String name; 
  21.  private int age; 
  22.  public Builder name(String name){ 
  23.  this.name = name; 
  24.  return this; 
  25.  } 
  26.  public Builder age(int age){ 
  27.  this.age = age; 
  28.  return this; 
  29.  } 
  30.  public Student build(){ 
  31.  Student student = new Student(); 
  32.  student.setAge(age); 
  33.  student.setName(name); 
  34.  return student; 
  35.  } 
  36.  } 

调用方式:

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

(编辑:ASP站长网)

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