Lombok使用注意事項

今天發現線上數據的某個字段被莫名更改了,找了一下緣由,才發現使用lombok有不少注意事項。接下來一一講述java

@Builder注意事項

類中字段默認值不會被直接使用

咱們有個學生類代碼以下:
其中學生類有一個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代碼分析
clipboard.png
在line110 ~ line 115能夠發現一個@Default註解。註釋的意思就是:使用@Default註釋的字段須要有一個初始化表達式(即咱們字段的默認值),若是在生成期間沒有顯式的給該字段set值,則採起該值。對象

注:使用@Builder以後對於一些有意義的值最好顯式賦值一下,若是想使用類中字段的默認值須要使用@Default註解。blog

構造函數:@Builder會提供一個私有的全參構造方法

@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(); 
  }
}

clipboard.png
注: 在@Builder的註釋中能夠看到使用@Builder註解以後會默認的生成一個私有的全參構造方法,不會再生成一個無參構造方法,因此此時直接使用 new Studet()是會提示錯誤的。此時應該再提供使用一個註解@NoArgsConstructor,提供一個無參構造方法。ip

相關文章
相關標籤/搜索