深入理解Java中@Accessors和@Builder
@Accessors和@Builder
@Accessors(chain=true)
就是new一個對象后可以鏈式調用set給屬性賦值。
@Data
@Accessors(chain = true)
public class User {
private String name;
private Integer age;
private Double weight;
public static void main(String[] args) {
User user = new User().setName("張三").setAge(18).setWeight(60.00);
System.out.println(user);
}
}從上面的代碼我們看到new User()后面可以鏈式調用set方法賦值。
這是因為@Accessors(chain=true)將lombok生成的setter方法返回值變?yōu)榱?code>this,也就是返回了對象本身,代替了原本的void。
@Builder
@Builer注解是基于建造者模式的鏈式操作。
@Data
@Builder
public class User {
private String name;
private Integer age;
private Double weight;
public static void main(String[] args) {
User user = User.builder().name("張三").age(18).weight(60.00).build();
System.out.println(user);
}
}我們能看到是先使用 bulder 方法后再鏈式操作,然后調用 build 方法返回。
原因是內部生成了構建起 UserBuilder ,調用 builder() 方法就是是創(chuàng)建 UserBuilder 對象,然后給 UserBuilder 對象賦值,最后通過 UserBuilder 對象的 build() 來生成 User 對象。
可以看編譯后的class文件
@Accessors和@Builder的區(qū)別
其實我們看它們編譯后的class文件就可以直到原因。 @Accessors 是將生成的 setter() 方法返回 this ,而 @Builder 是再對象內部創(chuàng)建一個構建器,通過這個構建器來最終創(chuàng)建對象。
@Builder 底層新建了一個對象,為了實現(xiàn)鏈式調用再創(chuàng)建一個對象感覺優(yōu)點大材小用了。 @Accessors 再實現(xiàn)了鏈式調用的基礎上,減少了多余對象的創(chuàng)建。
@Accessors和@Builder使用的坑
- 在有的開源反射工具包對對象進行淺拷貝時,獲取set方法原信息時會判斷返回值是否為void,這樣使用
@Accessors注解就會報錯。 @Builder注解會給類默認生成全參構造,這樣就沒有了默認的無參構造,在Spring這類容器中默認調用無參構造就報錯了,所以要加上@NoArgsConstructor和@AllArgsConstructor注解
詳細看看@Accessors注解
@Accessors的源碼

可以看到它有四個屬性, chian=true 就是可以鏈式調用,其他的下面我們來分別說明下。
@Accessors屬性說明
fluent屬性
fluent=true 時,setter和getter方法就沒有set和get了,直接調用屬性名即可

chain屬性
chain=true 時,就可以鏈式調用setter方法給屬性賦值了

makeFinal屬性
makeFinal=true 時,生成的setter和getter方法都是final修飾的方法

final修飾的方法表示不能在子類中重寫這些方法。
prefix屬性
該屬性添加一個數(shù)據(jù),添加屬性的前綴,表示忽略屬性對應的前綴來生成setter和getter方法

如上圖一樣,屬性賦值的時候就可以忽略前綴。
prefix屬性的坑
1、如果屬性的前綴和prefix寫的前綴不匹配,那setter和getter方法就不會生成了。
2、屬性的前綴后的第一個字母必須是大寫,否則也不會生成setter和getter方法。
3、上面說的不會生成setter和getter方法是連不去前綴的都不會生成,相當于@Data注解失效了。
到此這篇關于深入理解Java中@Accessors和@Builder的文章就介紹到這了,更多相關Java中@Accessors和@Builder內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決使用httpclient傳遞json數(shù)據(jù)亂碼的問題
這篇文章主要介紹了解決使用httpclient傳遞json數(shù)據(jù)亂碼的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
springboot與mybatis整合實例詳解(完美融合)
大家都知道springboot搭建一個spring框架只需要秒秒鐘。下面通過實例代碼給大家介紹一下springboot與mybatis的完美融合,非常不錯,具有參考借鑒價值,感興趣的朋友一起看看吧2016-09-09
Java中使用JWT生成Token進行接口鑒權實現(xiàn)方法
這篇文章主要介紹了Java中使用JWT生成Token進行接口鑒權實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08
Python安裝Jupyter Notebook配置使用教程詳解
這篇文章主要介紹了Python安裝Jupyter Notebook配置使用教程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09

