最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中@RequiredArgsConstructor注解的基本用法

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

前言

從源碼中學(xué)習(xí),事因是看到項目代碼中有所引用

@RequiredArgsConstructor 是 Lombok 提供的一個注解,用于自動生成一個包含所有 final 字段和帶有 @NonNull 注解字段的構(gòu)造函數(shù)

這可以減少樣板代碼,尤其是在需要依賴注入時

1. 基本知識

Lombok 是一個 Java 庫,通過注解簡化代碼

常用注解包括 @Getter, @Setter, @ToString, @EqualsAndHashCode, 和 @Data 等

針對@RequiredArgsConstructor 注解會生成一個包含所有 final 字段和帶有 @NonNull 注解字段的構(gòu)造函數(shù) 

這對于構(gòu)造必須初始化這些字段的對象非常有用

基本的語法如下:

@RequiredArgsConstructor
public class MyClass {
    private final String name;
    private final int age;
    private String address;
    
    @NonNull
    private String phoneNumber;
}

對應(yīng)生成的構(gòu)造函數(shù)如下:

public MyClass(String name, int age, String phoneNumber) {
    this.name = name;
    this.age = age;
    this.phoneNumber = phoneNumber;
}

對應(yīng)需要注意的事項如下:

  • 字段的順序:生成的構(gòu)造函數(shù)中的參數(shù)順序是按照字段在類中定義的順序
  • @NonNull 注解:如果某個字段帶有 @NonNull 注解,它也會包含在構(gòu)造函數(shù)中,即使它不是 final 的。

與其他構(gòu)造函數(shù)沖突:如果手動定義了構(gòu)造函數(shù),@RequiredArgsConstructor 生成的構(gòu)造函數(shù)可能會與其沖突

與其他注解比較:

  • @NoArgsConstructor:生成一個無參構(gòu)造函數(shù)。
  • @AllArgsConstructor:生成一個包含所有字段(包括非 final 字段)的構(gòu)造函數(shù)

2. 源碼解讀

先看源碼的對應(yīng)屬性

對應(yīng)的屬性分析如下:

staticName:

  • 設(shè)置了這個屬性,會生成一個靜態(tài)方法,該方法調(diào)用私有構(gòu)造函數(shù)
  • 這個靜態(tài)方法主要用于推斷類型參數(shù)

onConstructor:

  • 允許在生成的構(gòu)造函數(shù)上添加指定的注解
  • JDK 7 和 JDK 8 的語法稍有不同。

access:

  • 設(shè)置構(gòu)造函數(shù)的訪問級別
  • 默認是 public,可以設(shè)置為 private, protected 或 package

針對源碼結(jié)合以下Demo進行展示

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);

        // 錯誤使用示例(會導(dǎo)致編譯錯誤)
        // Person person2 = new Person("Jane", "Doe");
    }

    @Override
    public String toString() {
        return "Person{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", email='" + email + '\'' +
                ", age=" + age +
                '}';
    }
}

明確需要3個屬性,不可超過4個

再者對應(yīng)的字段屬性是按照順序的,如果更換順序會出現(xiàn)如下場景:

test person = new test("碼農(nóng)","https://blog.csdn.net/weixin_47872288","研究僧");

3.2 staticName屬性

@RequiredArgsConstructor(staticName = "of") 

會生成一個靜態(tài)方法 of 來實例化對象,而不是直接調(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"))) 

會在生成的構(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ù)的訪問級別設(shè)置為 public 或 protected,直接進行new

但是我的private它竟然可以new(神奇=-=)

4. @AllArgsConstructor比較

使用 @RequiredArgsConstructor 時,只有 final 字段和 @NonNull 字段會被初始化

但是@AllArgsConstructor 生成一個構(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);

        // 錯誤使用示例(會導(dǎo)致編譯錯誤)
        // Person person2 = new Person("Jane", "Doe");
    }

    @Override
    public String toString() {
        return "Person{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", email='" + email + '\'' +
                ", age=" + age +
                '}';
    }
}

截圖如下:(必須要有四個參數(shù))

這兩者都可以實用構(gòu)造函數(shù)注入,但推薦使用@RequiredArgsConstructor,因為它只會初始化那些在創(chuàng)建對象時必需的字段

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java常用鎖synchronized和ReentrantLock的區(qū)別

    Java常用鎖synchronized和ReentrantLock的區(qū)別

    這篇文章主要介紹了Java常用鎖synchronized和ReentrantLock的區(qū)別,二者的功效都是相同的,但又有很多不同點,下面我們就進入文章了解具體的相關(guān)內(nèi)容吧。需要的小伙伴也可以參考一下
    2022-05-05
  • 詳解5種Java中常見限流算法

    詳解5種Java中常見限流算法

    在高并發(fā)系統(tǒng)中,出于系統(tǒng)保護角度考慮,通常會對流量進行限流;不但在工作中要頻繁使用,而且也是面試中的高頻考點。本文就為大家整理了5種Java中常見限流算法,需要的可以參考一下
    2023-04-04
  • Spring Boot 3 集成 RabbitMQ 實踐指南(原理解析)

    Spring Boot 3 集成 RabbitMQ 實踐指南(原理解析

    本文介紹了SpringBoot 3集成RabbitMQ的實踐指南,涵蓋了RabbitMQ的核心原理、核心概念、高級特性、應(yīng)用場景、環(huán)境搭建、核心配置類、消息生產(chǎn)者、消息消費者、接口控制器、監(jiān)控與運維、最佳實踐以及常見問題與解決方案等內(nèi)容,感興趣的朋友一起看看吧
    2025-02-02
  • Springboot日期轉(zhuǎn)換器實現(xiàn)代碼及示例

    Springboot日期轉(zhuǎn)換器實現(xiàn)代碼及示例

    這篇文章主要介紹了Springboot日期轉(zhuǎn)換器實現(xiàn)代碼及示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • SpringCloud Feign高級配置詳解

    SpringCloud Feign高級配置詳解

    這篇文章主要介紹了SpringCloud Feign高級配置,feign是netflix提供的服務(wù)間基于http的rpc調(diào)用框架,在spring cloud得到廣泛應(yīng)用
    2022-09-09
  • Java常見異常全面梳理(含分類+含義+典型場景)

    Java常見異常全面梳理(含分類+含義+典型場景)

    異常是指程序在執(zhí)行過程中,出現(xiàn)的非正常情況,可能由程序員錯誤、系統(tǒng)錯誤或用戶輸入錯誤引起,下面這篇文章主要介紹了Java常見異常全面梳理的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-03-03
  • IDEA中g(shù)it不提交指定文件的問題

    IDEA中g(shù)it不提交指定文件的問題

    文章主要介紹了在使用IntelliJ IDEA進行Git提交時,如何排除特定文件或文件夾不提交到Git倉庫,通過創(chuàng)建一個新的Changelist并將其命名為“不提交的文件”,然后將不需要提交的文件移動到這個Changelist中,可以在提交時選擇不包含這個Changelist中的文件
    2025-10-10
  • SpringBoot登錄驗證碼實現(xiàn)過程詳解

    SpringBoot登錄驗證碼實現(xiàn)過程詳解

    這篇文章主要介紹了SpringBoot登錄驗證碼實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • IDEA配置Tomcat創(chuàng)建web項目的詳細步驟

    IDEA配置Tomcat創(chuàng)建web項目的詳細步驟

    Tomcat是一個Java?Web應(yīng)用服務(wù)器,實現(xiàn)了多個Java?EE規(guī)范(JSP、Java?Servlet等),這篇文章主要給大家介紹了關(guān)于IDEA配置Tomcat創(chuàng)建web項目的詳細步驟,需要的朋友可以參考下
    2023-12-12
  • Spring多數(shù)據(jù)源切換失敗,發(fā)現(xiàn)與事務(wù)相關(guān)問題

    Spring多數(shù)據(jù)源切換失敗,發(fā)現(xiàn)與事務(wù)相關(guān)問題

    這篇文章主要介紹了Spring多數(shù)據(jù)源切換失敗,發(fā)現(xiàn)與事務(wù)相關(guān)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論

桐城市| 乌恰县| 辽源市| 阳原县| 大宁县| 云安县| 乐亭县| 韶关市| 仁怀市| 屯留县| 大连市| 含山县| 米易县| 奇台县| 武宁县| 克山县| 淮安市| 霍州市| 曲沃县| 台北市| 沁水县| 邯郸市| 台江县| 阳西县| 灵璧县| 吴堡县| 万州区| 梧州市| 汶上县| 徐州市| 博白县| 朝阳市| 金堂县| 灯塔市| 贵定县| 明星| 永兴县| 吕梁市| 江西省| 南华县| 嘉禾县|