Lombok 的 @RequiredArgsConstructor 註解
1. 概述
Java是一種面向對象的語言,這意味著我們在初始化對象時必須處理構造函數。
Project Lombok 可以幫助我們通過簡單地為不同類型的構造函數使用不同的註釋來生成構造函數,從而減少編寫樣板代碼的工作量。
在本教程中,我們將了解@RequiredArgsConstructor
註釋如何幫助我們自動生成類的構造函數。
2. 設置
要使用Project Lombok ,讓我們在pom.xml
文件中添加依賴項:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
<scope>provided</scope>
</dependency>
3. 使用方法
@RequiredArgsConstructor
是一個 Lombok 註釋,它為所有final
字段和非null
字段生成構造函數。
在我們的示例中,我們將定義具有不同範圍的成員變量的類,並查看註釋在不同場景中的行為方式。
3.1. final
字段
final
字段是類成員,在構造函數完成之前初始化一次。
讓我們定義一個帶有final
字段的類,然後測試@RequiredArgsConstructor
註釋是否相同:
@RequiredArgsConstructor
public class ClassWithFinalMembers {
private final String stringObject;
// standard getters
}
@RequiredAgrsConstructor
註釋生成帶有final
成員的參數化構造函數。現在我們將執行一個簡單的測試來成功初始化上述類:
@Test
void whenClassHasFinalMembers_thenGeneratedConstructorHasParameters() {
ClassWithFinalMembers classWithFinalMembers = new ClassWithFinalMembers("dummyString");
Assertions.assertNotNull(classWithFinalMembers);
Assertions.assertEquals("dummyString", classWithFinalMembers.getStringObject());
}
3.2.非final
字段
當類具有非final
字段時, @RequierdArgsConstructor
註釋在生成代碼時不會將它們添加到構造函數參數中。
如果沒有final
字段或非null
字段,只有非final
字段,那麼我們將得到一個不生成參數的構造函數。
讓我們看一下上述場景的示例,然後用一個簡單的測試用例來驗證它:
@RequiredArgsConstructor
public class ClassWithNonFinalMembers {
private String stringObject;
// standard getters
}
@Test
void whenClassHasNonFinalMembers_thenGeneratedConstructorHasNoParameters() {
ClassWithNonFinalMembers classWithNonFinalMembers = new ClassWithNonFinalMembers();
Assertions.assertNotNull(classWithNonFinalMembers);
}
我們定義了一個帶有非final
成員的類,因此使用@RequiredArgsConstructor
不會將該成員添加到生成的構造函數參數中。如果我們嘗試使用參數化構造函數,編譯器會拋出錯誤。
3.3.非null
字段
要生成具有非null
字段的構造函數,我們可以使用@NonNull
Lombok 註釋:
@RequiredArgsConstructor
public class ClassWithFinalNonNullMembers {
private final String finalStringObject;
@NonNull
private String nonNullStringObject;
private String nonFinalStringObject;
// standard getters
}
現在,讓我們看一個簡單的測試用例:
@Test
void whenClassHasFinalAndNonNullMembers_thenGeneratedConstructorHasParameters() {
ClassWithFinalNonNullMembers classWithFinalNonNullMembers = new ClassWithFinalNonNullMembers("finalString", "nonNullString");
Assertions.assertNotNull(classWithFinalNonNullMembers);
Assertions.assertEquals("finalString", classWithFinalNonNullMembers.getFinalStringObject());
Assertions.assertEquals("nonNullString", classWithFinalNonNullMembers.getNonNullStringObject());
Assertions.assertNull(classWithFinalNonNullMembers.getNonFinalStringObject());
}
我們定義了一個具有final
、非null
和非final
成員的類。因此, @RequiredArgsConstructor
註解生成構造函數,該構造函數除了final
成員之外還初始化非null
成員。
4。結論
在本文中,我們了解了@RequiredArgsConstructor
如何生成構造函數來初始化類的成員。
final
成員和註釋為@NonNull
成員包含在構造函數參數和定義中。但是,既不是final
的也不是用@NonNull
註釋的成員不會由生成的構造函數初始化。
與往常一樣,所有示例的源代碼都可以在 GitHub 上找到。