亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中@RequiredArgsConstructor注解的基本用法

 更新時(shí)間:2024年09月04日 10:30:35   作者:碼農(nóng)研究僧  
這篇文章主要介紹了Java中@RequiredArgsConstructor注解的基本用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

前言

從源碼中學(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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • IDEA的Web項(xiàng)目右鍵無法創(chuàng)建Servlet問題解決辦法

    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)

    這篇文章主要介紹了關(guān)于JavaEE匿名內(nèi)部類和Lambda表達(dá)式的注意事項(xiàng),匿名內(nèi)部類顧名思義是沒有修飾符甚至沒有名稱的內(nèi)部類,使用匿名內(nèi)部類需要注意哪些地方,我們一起來看看吧
    2023-03-03
  • 基于Java class對(duì)象說明、Java 靜態(tài)變量聲明和賦值說明(詳解)

    基于Java class對(duì)象說明、Java 靜態(tài)變量聲明和賦值說明(詳解)

    下面小編就為大家?guī)硪黄贘ava class對(duì)象說明、Java 靜態(tài)變量聲明和賦值說明(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • Spring的DI依賴注入詳解

    Spring的DI依賴注入詳解

    這篇文章主要為大家介紹了Spring的DI依賴注入,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Java double類型比較大小詳解

    Java double類型比較大小詳解

    這篇文章主要介紹了Java double類型比較大小,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java 漢諾塔Hanoi遞歸、非遞歸(仿系統(tǒng)遞歸)和非遞歸規(guī)律 實(shí)現(xiàn)代碼

    java 漢諾塔Hanoi遞歸、非遞歸(仿系統(tǒng)遞歸)和非遞歸規(guī)律 實(shí)現(xiàn)代碼

    漢諾塔(Hanoi) 算法Java實(shí)現(xiàn)。通過三個(gè)函數(shù),分別對(duì)Hanoi進(jìn)行遞歸、非遞歸和非遞歸規(guī)律實(shí)現(xiàn)。
    2013-05-05
  • JavaCV調(diào)用百度AI實(shí)現(xiàn)人臉檢測(cè)方法詳解

    JavaCV調(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(容器組)

    這篇文章主要介紹了JavaFX桌面應(yīng)用開發(fā)-Group(容器組),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Spring中的事務(wù)傳播行為示例詳解

    Spring中的事務(wù)傳播行為示例詳解

    這篇文章主要給大家介紹了關(guān)于Spring中事務(wù)傳播行為的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • SpringBoot中使用MQTT實(shí)現(xiàn)消息的訂閱和發(fā)布(示例代碼)

    SpringBoot中使用MQTT實(shí)現(xiàn)消息的訂閱和發(fā)布(示例代碼)

    這篇文章主要介紹了SpringBoot中使用MQTT實(shí)現(xiàn)消息的訂閱和發(fā)布的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-06-06

最新評(píng)論