仔细看一下 set 方法,这样的设置便是 chain 的 style,调用的时候,可以这样使用:
- Student student = new Student()
- .setAge(24)
- .setName("zs");
相信合理使用这样的链式代码,会更多的程序带来很好的可读性,那看一下如果使用 lombok 进行改善呢,请使用 @Accessors(chain = true),看如下代码:
- @Accessors(chain = true)
- @Setter
- @Getter
- public class Student {
- private String name;
- private int age;
- }
这样就完成了一个对于 bean 来讲很友好的链式操作。
静态构造方法
静态构造方法的语义和简化程度真的高于直接去 new 一个对象。比如 new 一个 List 对象,过去的使用是这样的:
- List<String> list = new ArrayList<>();
看一下 guava 中的创建方式:
- List<String> list = Lists.newArrayList();
Lists 命名是一种约定(俗话说:约定优于配置),它是指 Lists 是 List 这个类的一个工具类,那么使用 List 的工具类去产生 List,这样的语义是不是要比直接 new 一个子类来的更直接一些呢,答案是肯定的,再比如如果有一个工具类叫做 Maps,那你是否想到了创建 Map 的方法呢:
- HashMap<String, String> objectObjectHashMap = Maps.newHashMap();
好了,如果你理解了我说的语义,那么,你已经向成为 Java 程序员更近了一步了。
再回过头来看刚刚的 Student,很多时候,我们去写 Student 这个 bean 的时候,他会有一些必输字段,比如 Student 中的 name 字段,一般处理的方式是将 name 字段包装成一个构造方法,只有传入 name 这样的构造方法,才能创建一个 Student 对象。
接上上边的静态构造方法和必传参数的构造方法,使用 lombok 将更改成如下写法(@RequiredArgsConstructor 和 @NonNull):
- @Accessors(chain = true)
- @Setter
- @Getter
- @RequiredArgsConstructor(staticName = "ofName")
- public class Student {
- @NonNull private String name;
- private int age;
- }
测试代码:
- Student student = Student.ofName("zs");
这样构建出的 bean 语义是否要比直接 new 一个含参的构造方法(包含 name 的构造方法)要好很多。
当然,看过很多源码以后,我想相信将静态构造方法 ofName 换成 of 会先的更加简洁:
- @Accessors(chain = true)
- @Setter
- @Getter
- @RequiredArgsConstructor(staticName = "of")
- public class Student {
- @NonNull private String name;
- private int age;
- }
测试代码:
- Student student = Student.of("zs");
当然他仍然是支持链式调用的:
- Student student = Student.of("zs").setAge(24);
这样来写代码,真的很简洁,并且可读性很强。
使用 builder
Builder 模式我不想再多解释了,读者可以看一下《Head First》(设计模式) 的建造者模式。
今天其实要说的是一种变种的 builder 模式,那就是构建 bean 的 builder 模式,其实主要的思想是带着大家一起看一下 lombok 给我们带来了什么。
看一下 Student 这个类的原始 builder 状态:
- public class Student {
- private String name;
- private int age;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public static Builder builder(){
- return new Builder();
- }
- public static class Builder{
- private String name;
- private int age;
- public Builder name(String name){
- this.name = name;
- return this;
- }
- public Builder age(int age){
- this.age = age;
- return this;
- }
- public Student build(){
- Student student = new Student();
- student.setAge(age);
- student.setName(name);
- return student;
- }
- }
- }
调用方式:
- Student student = Student.builder().name("zs").age(24).build();
(编辑:ASP站长网)
|