Java中@RequiredArgsConstructor注解的基本用法
前言
從源碼中學(xué)習(xí),事因是看到項(xiàng)目代碼中有所引用
@RequiredArgsConstructor
是 Lombok 提供的一個(gè)注解,用于自動(dòng)生成一個(gè)包含所有 final 字段和帶有 @NonNull 注解字段的構(gòu)造函數(shù)
這可以減少樣板代碼,尤其是在需要依賴注入時(shí)
1. 基本知識(shí)
Lombok 是一個(gè) Java 庫,通過注解簡化代碼
常用注解包括 @Getter, @Setter, @ToString, @EqualsAndHashCode, 和 @Data 等
針對(duì)@RequiredArgsConstructor 注解會(huì)生成一個(gè)包含所有 final 字段和帶有 @NonNull 注解字段的構(gòu)造函數(shù)
這對(duì)于構(gòu)造必須初始化這些字段的對(duì)象非常有用
基本的語法如下:
@RequiredArgsConstructor public class MyClass { private final String name; private final int age; private String address; @NonNull private String phoneNumber; }
對(duì)應(yīng)生成的構(gòu)造函數(shù)如下:
public MyClass(String name, int age, String phoneNumber) { this.name = name; this.age = age; this.phoneNumber = phoneNumber; }
對(duì)應(yīng)需要注意的事項(xiàng)如下:
字段的順序
:生成的構(gòu)造函數(shù)中的參數(shù)順序是按照字段在類中定義的順序@NonNull
注解:如果某個(gè)字段帶有 @NonNull 注解,它也會(huì)包含在構(gòu)造函數(shù)中,即使它不是 final 的。
與其他構(gòu)造函數(shù)沖突:如果手動(dòng)定義了構(gòu)造函數(shù),@RequiredArgsConstructor 生成的構(gòu)造函數(shù)可能會(huì)與其沖突
與其他注解比較:
@NoArgsConstructor
:生成一個(gè)無參構(gòu)造函數(shù)。@AllArgsConstructor
:生成一個(gè)包含所有字段(包括非 final 字段)的構(gòu)造函數(shù)
2. 源碼解讀
先看源碼的對(duì)應(yīng)屬性
對(duì)應(yīng)的屬性分析如下:
staticName
:
- 設(shè)置了這個(gè)屬性,會(huì)生成一個(gè)靜態(tài)方法,該方法調(diào)用私有構(gòu)造函數(shù)
- 這個(gè)靜態(tài)方法主要用于推斷類型參數(shù)
onConstructor
:
- 允許在生成的構(gòu)造函數(shù)上添加指定的注解
- JDK 7 和 JDK 8 的語法稍有不同。
access
:
- 設(shè)置構(gòu)造函數(shù)的訪問級(jí)別
- 默認(rèn)是 public,可以設(shè)置為 private, protected 或 package
針對(duì)源碼結(jié)合以下Demo進(jìn)行展示
3. Demo
3.1 簡易Demo
import lombok.NonNull; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class test { private final String firstName; private final String lastName; @NonNull private String email; private int age; public static void main(String[] args) { // 正確使用示例 test person = new test("碼農(nóng)", "研究僧", "https://blog.csdn.net/weixin_47872288"); System.out.println("Person created: " + person); // 錯(cuò)誤使用示例(會(huì)導(dǎo)致編譯錯(cuò)誤) // Person person2 = new Person("Jane", "Doe"); } @Override public String toString() { return "Person{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", email='" + email + '\'' + ", age=" + age + '}'; } }
明確需要3個(gè)屬性,不可超過4個(gè)
再者對(duì)應(yīng)的字段屬性是按照順序的,如果更換順序會(huì)出現(xiàn)如下場(chǎng)景:
test person = new test("碼農(nóng)","https://blog.csdn.net/weixin_47872288","研究僧");
3.2 staticName屬性
@RequiredArgsConstructor(staticName = "of")
會(huì)生成一個(gè)靜態(tài)方法 of 來實(shí)例化對(duì)象,而不是直接調(diào)用構(gòu)造函數(shù)
import lombok.AllArgsConstructor; import lombok.NonNull; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor(staticName = "of") public class test { private final String firstName; private final String lastName; private final String email; public static void main(String[] args) { test example = test.of("碼農(nóng)","研究僧","https://blog.csdn.net/weixin_47872288"); System.out.println(example); } @Override public String toString() { return "StaticConstructorExample{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", email='" + email + '\'' + '}'; } }
截圖如下:
3.3 onConstructor屬性
@RequiredArgsConstructor(onConstructor_ = @__(@CustomAnnotation("Custom Constructor")))
會(huì)在生成的構(gòu)造函數(shù)上添加 @CustomAnnotation
import lombok.AllArgsConstructor; import lombok.NonNull; import lombok.RequiredArgsConstructor; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.CONSTRUCTOR}) @Retention(RetentionPolicy.RUNTIME) @interface CustomAnnotation { String value(); } @RequiredArgsConstructor(onConstructor_ = @__(@CustomAnnotation("Custom Constructor"))) public class test { private final String firstName; private final String lastName; private final String email; public static void main(String[] args) { test example = new test("碼農(nóng)","研究僧","https://blog.csdn.net/weixin_47872288"); System.out.println(example); } @Override public String toString() { return "StaticConstructorExample{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", email='" + email + '\'' + '}'; } }
3.4 access屬性
@RequiredArgsConstructor(access = AccessLevel.PRIVATE, staticName = "of") public class test { private final String firstName; private final String lastName; private final String email; public static void main(String[] args) { test example = test.of("碼農(nóng)", "研究僧", "https://blog.csdn.net/weixin_47872288"); System.out.println(example); } @Override public String toString() { return "StaticConstructorExample{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", email='" + email + '\'' + '}'; } }
不需要構(gòu)造函數(shù)是私有的,可以將構(gòu)造函數(shù)的訪問級(jí)別設(shè)置為 public 或 protected,直接進(jìn)行new
但是我的private它竟然可以new(神奇=-=)
4. @AllArgsConstructor比較
使用 @RequiredArgsConstructor
時(shí),只有 final 字段和 @NonNull 字段會(huì)被初始化
但是@AllArgsConstructor
生成一個(gè)構(gòu)造函數(shù),該構(gòu)造函數(shù)包含類中所有字段,無論它們是否為 final 或帶有 @NonNull 注解
@AllArgsConstructor public class test { private final String firstName; private String lastName; @NonNull private String email; private int age; public static void main(String[] args) { // 正確使用示例 test person = new test("碼農(nóng)","研究僧","https://blog.csdn.net/weixin_47872288",18); System.out.println("Person created: " + person); // 錯(cuò)誤使用示例(會(huì)導(dǎo)致編譯錯(cuò)誤) // Person person2 = new Person("Jane", "Doe"); } @Override public String toString() { return "Person{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", email='" + email + '\'' + ", age=" + age + '}'; } }
截圖如下:(必須要有四個(gè)參數(shù))
這兩者都可以實(shí)用構(gòu)造函數(shù)注入,但推薦使用@RequiredArgsConstructor
,因?yàn)樗粫?huì)初始化那些在創(chuàng)建對(duì)象時(shí)必需的字段
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- spring中的特殊注解@RequiredArgsConstructor詳解
- 使用@RequiredArgsConstructor注解來取代繁瑣的@Autowrired
- 解讀@NoArgsConstructor,@AllArgsConstructor,@RequiredArgsConstructor的區(qū)別及在springboot常用地方
- Java中的@RequiredArgsConstructor注解詳解
- @RequiredArgsConstructor如何實(shí)現(xiàn)構(gòu)造器注入
- springboot @RequiredArgsConstructor的概念與使用方式
- Java中@RequiredArgsConstructor使用詳解
相關(guān)文章
IDEA的Web項(xiàng)目右鍵無法創(chuàng)建Servlet問題解決辦法
這篇文章主要介紹了IDEA的Web項(xiàng)目右鍵無法創(chuàng)建Servlet問題解決辦法的相關(guān)資料,在IDEA中新建Servlet時(shí)發(fā)現(xiàn)缺失選項(xiàng),可以通過在pom.xml文件中添加servlet依賴解決,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10關(guān)于JavaEE匿名內(nèi)部類和Lambda表達(dá)式的注意事項(xiàng)
這篇文章主要介紹了關(guān)于JavaEE匿名內(nèi)部類和Lambda表達(dá)式的注意事項(xiàng),匿名內(nèi)部類顧名思義是沒有修飾符甚至沒有名稱的內(nèi)部類,使用匿名內(nèi)部類需要注意哪些地方,我們一起來看看吧2023-03-03基于Java class對(duì)象說明、Java 靜態(tài)變量聲明和賦值說明(詳解)
下面小編就為大家?guī)硪黄贘ava class對(duì)象說明、Java 靜態(tài)變量聲明和賦值說明(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06java 漢諾塔Hanoi遞歸、非遞歸(仿系統(tǒng)遞歸)和非遞歸規(guī)律 實(shí)現(xiàn)代碼
漢諾塔(Hanoi) 算法Java實(shí)現(xiàn)。通過三個(gè)函數(shù),分別對(duì)Hanoi進(jìn)行遞歸、非遞歸和非遞歸規(guī)律實(shí)現(xiàn)。2013-05-05JavaCV調(diào)用百度AI實(shí)現(xiàn)人臉檢測(cè)方法詳解
在檢測(cè)人臉數(shù)量、位置、性別、口罩等場(chǎng)景時(shí),可以考慮使用百度開放平臺(tái)提供的web接口,一個(gè)web請(qǐng)求就能完成檢測(cè)得到結(jié)果。本文就為大家介紹JavaCV如何調(diào)用百度AI實(shí)現(xiàn)最簡單的人臉檢測(cè),需要的可以參考一下2022-01-01詳解JavaFX桌面應(yīng)用開發(fā)-Group(容器組)
這篇文章主要介紹了JavaFX桌面應(yīng)用開發(fā)-Group(容器組),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04SpringBoot中使用MQTT實(shí)現(xiàn)消息的訂閱和發(fā)布(示例代碼)
這篇文章主要介紹了SpringBoot中使用MQTT實(shí)現(xiàn)消息的訂閱和發(fā)布的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-06-06