1. 為什么要使用Builder
《effective jave》書中提到郑诺,當一個封裝對象中屬性過多時,使用builder構(gòu)造器是一個很好的選擇杉武,代碼可讀性強辙诞。但是使用builder又要在對象里寫一堆構(gòu)造器代碼,新增了屬性或者刪除之后還要同步修改構(gòu)造器代碼轻抱,非常的繁瑣飞涂,所以我也不愿意使用。后來祈搜,我發(fā)現(xiàn)了lombok中有了@Builder注解较店。
2. @Builder注解的使用
@Getter
@Setter
@Builder
public class Father {
private Integer id;
private String name;
private Integer age;
}
然后看一下編譯后的文件內(nèi)容
public class Father {
private Integer id;
private String name;
private Integer age;
Father(final Integer id, final String name, final Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public static Father.FatherBuilder builder() {
return new Father.FatherBuilder();
}
public Integer getId() {
return this.id;
}
public String getName() {
return this.name;
}
public Integer getAge() {
return this.age;
}
public void setId(final Integer id) {
this.id = id;
}
public void setName(final String name) {
this.name = name;
}
public void setAge(final Integer age) {
this.age = age;
}
public static class FatherBuilder {
private Integer id;
private String name;
private Integer age;
FatherBuilder() {
}
public Father.FatherBuilder id(final Integer id) {
this.id = id;
return this;
}
public Father.FatherBuilder name(final String name) {
this.name = name;
return this;
}
public Father.FatherBuilder age(final Integer age) {
this.age = age;
return this;
}
public Father build() {
return new Father(this.id, this.name, this.age);
}
public String toString() {
return "Father.FatherBuilder(id=" + this.id + ", name=" + this.name + ", age=" + this.age + ")";
}
}
}
生成了全參構(gòu)造器和構(gòu)造器模式代碼
3.需要注意的坑
仔細看會發(fā)現(xiàn)此時并沒有生成無參構(gòu)造,一些框架序列化喜歡用反射new對象容燕,比如現(xiàn)在比較流行的序列化框架Fastjson梁呈,這時候就會報錯,而反射new對象在編譯期是發(fā)現(xiàn)不了的蘸秘,所以容易導致線上問題官卡。此時有幾種解決方式
1.同時加上無參和有參的注解,讓對象同時生成有參和無參方法(推薦)
@AllArgsConstructor
@NoArgsConstructor
2.自己寫無參構(gòu)造,加上@Tolerate注解讓lombok忽略它(這種寫法不推薦醋虏,ide程序會無法識別出全參構(gòu)造寻咒,導致你寫全參構(gòu)造的時候代碼標紅,強迫黨不能忍)
@Getter
@Setter
@Builder
public class Father {
private Integer id;
private String name;
private Integer age;
@Tolerate
Father() {
}
}
總結(jié)
使用@Builder的時候颈嚼,最好和@AllArgsConstructor毛秘,@NoArgsConstructor一起用。