今天發現線上數據的某個字段被莫名更改了,找了一下緣由,才發現使用lombok有不少注意事項。接下來一一講述java
咱們有個學生類代碼以下:
其中學生類有一個stuStatus字段表示學生就讀狀態,默認值1,表示默認是在讀狀態。當經過builder()構建學生對象以後,若是不給stuStatus賦值,該字段的值並非默認值1,而是int的默認值0;函數
@Data @Builder public class Student { // 學生學號 private String stuNumber; // 學生姓名 private String stuName; // 學生狀態(1:在讀 2:離校) 默認是1,表示在讀狀態 private int stuStatus = 1; } public class TestStudent() { @Test public void testBuilder() { // 如下代碼構建完成以後,student的stuStatus字段並非默認值1,而是int的默認值0; Student student = Student.builder().build(); // Student{stuNumer:null,stuName:null,stuStatus:0} } }
爲何出現這種狀況呢?
由於lombok在builder()的時候若是沒有顯示的給字段賦值,那麼這個字段的值就是java中的默認值(int:0 String:null這種的),即便在類中給字段設置默認值也不生效。ui
如何解決呢?spa
在字段上使用@Builder.Default註解。code
@Data @Builder public class Student { // 學生學號 private String stuNumber; // 學生姓名 private String stuName; // 學生狀態(1:在讀 2:離校) 默認是1,表示在讀狀態 // import lombok.Builder.Default; 或者使用@Builder.Default @Default private int stuStatus = 1; } public class TestStudent() { @Test public void testBuilder() { // 如下代碼構建完成以後,student的stuStatus字段就是默認值1 Student student = Student.builder().build(); // Student{stuNumer:null,stuName:null,stuStatus:1} } }
Lombok@Builder代碼分析
在line110 ~ line 115能夠發現一個@Default註解。註釋的意思就是:使用@Default註釋的字段須要有一個初始化表達式(即咱們字段的默認值),若是在生成期間沒有顯式的給該字段set值,則採起該值。對象
注:使用@Builder以後對於一些有意義的值最好顯式賦值一下,若是想使用類中字段的默認值須要使用@Default註解。blog
@Getter @Setter @Builder public class Student { // 學生學號 private String stuNumber; // 學生姓名 private String stuName; // 學生狀態(1:在讀 2:離校) 默認是1,表示在讀狀態 private int stuStatus = 1; } public class TestStudent() { @Test public void testBuilder() { // 這段代碼編譯不經過,由於@Builder提供了一個私有的全參構造方法,就不會自動生成無參的構造方法 Student student = new Student(); } }
注: 在@Builder的註釋中能夠看到使用@Builder註解以後會默認的生成一個私有的全參構造方法,不會再生成一個無參構造方法,因此此時直接使用 new Studet()是會提示錯誤的。此時應該再提供使用一個註解@NoArgsConstructor,提供一個無參構造方法。ip