欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的record使用詳解

 更新時(shí)間:2025年06月05日 11:39:54   作者:蘆屋花繪  
record 是 Java 14 引入的一種新語(yǔ)法(在 Java 16 中成為正式功能),用于定義不可變的數(shù)據(jù)類,這篇文章給大家介紹Java中的record相關(guān)知識(shí),感興趣的朋友一起看看吧

1. 什么是 record?

定義record 是 Java 14 引入的一種新語(yǔ)法(在 Java 16 中成為正式功能),用于定義不可變的數(shù)據(jù)類。

  • 目的:簡(jiǎn)化那些主要用于存儲(chǔ)數(shù)據(jù)的類的定義,減少樣板代碼。
  • 特點(diǎn)
    • 自動(dòng)實(shí)現(xiàn)構(gòu)造函數(shù)。
    • 自動(dòng)生成 equals()、hashCode()toString() 方法。
    • 字段默認(rèn)是 private final,且不可修改。

2. 基本語(yǔ)法

public record ClassName(Type fieldName1, Type fieldName2, ...) {
    // 可選:可以添加額外的方法或邏輯
}

示例

public record Point(int x, int y) {
}

等價(jià)于以下傳統(tǒng)類定義:

public final class Point {
    private final int x;
    private final int y;
    // 全參構(gòu)造器
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    // Getter 方法
    public int x() { return x; }
    public int y() { return y; }
    // 自動(dòng)覆蓋 equals 和 hashCode
    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Point)) return false;
        Point other = (Point) obj;
        return this.x == other.x && this.y == other.y;
    }
    @Override
    public int hashCode() {
        return Objects.hash(x, y);
    }
    // 自動(dòng)覆蓋 toString
    @Override
    public String toString() {
        return "Point[x=" + x + ", y=" + y + "]";
    }
}

3. record 的核心特性

(1)字段不可變

  • record 的字段默認(rèn)是 private final,且不能被修改。
  • 示例:
public record Point(int x, int y) {}
Point p = new Point(1, 2);
// p.x = 3; // 編譯錯(cuò)誤:x 是 final 的,不能修改

(2)自動(dòng)生成方法

  • 構(gòu)造函數(shù):根據(jù)字段自動(dòng)生成全參構(gòu)造函數(shù)。
  • getter 方法:為每個(gè)字段生成對(duì)應(yīng)的 getter 方法(名稱與字段名相同)。
  • equals()、hashCode()toString():根據(jù)字段自動(dòng)生成這些方法。

示例

Point p1 = new Point(1, 2);
Point p2 = new Point(1, 2);
System.out.println(p1.equals(p2)); // 輸出 true
System.out.println(p1.hashCode()); // 輸出基于字段值的哈希碼
System.out.println(p1);           // 輸出 Point[x=1, y=2]

(3)簡(jiǎn)潔性

  • 不需要手動(dòng)編寫(xiě)構(gòu)造函數(shù)、getter 方法、equals()、hashCode()toString()
  • 適合用來(lái)定義簡(jiǎn)單的數(shù)據(jù)載體類。

4. 使用場(chǎng)景

(1)封裝簡(jiǎn)單數(shù)據(jù)結(jié)構(gòu)

  • 當(dāng)你需要一個(gè)類來(lái)表示一組不可變的數(shù)據(jù)時(shí),可以使用 record。
  • 示例:
public record User(String name, int age) {}
User user = new User("Alice", 25);
System.out.println(user.name()); // 輸出 Alice

(2)配置類

  • 在 Spring Boot 等框架中,可以用 record 定義配置類。
  • 示例:
@ConfigurationProperties(prefix = "app")
public record AppProperties(String name, int port) {}

(3)DTO(數(shù)據(jù)傳輸對(duì)象)

  • 在微服務(wù)或前后端交互中,record 是一個(gè)很好的選擇,用于定義 DTO。
  • 示例:
public record BookDto(String title, String author, double price) {}

5. 自定義行為

雖然 record 自動(dòng)生成了許多方法,但你仍然可以對(duì)其進(jìn)行擴(kuò)展。

(1)添加額外方法

可以在 record 中定義額外的方法。

public record Point(int x, int y) {
    public double distanceFromOrigin() {
        return Math.sqrt(x * x + y * y);
    }
}
Point p = new Point(3, 4);
System.out.println(p.distanceFromOrigin()); // 輸出 5.0

(2)自定義構(gòu)造函數(shù)

你可以通過(guò)緊湊構(gòu)造函數(shù)對(duì)字段進(jìn)行驗(yàn)證或其他操作。

public record Point(int x, int y) {
    public Point {
        if (x < 0 || y < 0) {
            throw new IllegalArgumentException("Coordinates cannot be negative");
        }
    }
}
// Point p = new Point(-1, 2); // 拋出異常

緊湊構(gòu)造函數(shù) 是 record 提供的一種簡(jiǎn)潔語(yǔ)法,用于在不手動(dòng)寫(xiě)構(gòu)造參數(shù)和賦值的前提下,插入自定義邏輯(如校驗(yàn)),簡(jiǎn)潔高效,專為不可變數(shù)據(jù)對(duì)象設(shè)計(jì)。

6. 注意事項(xiàng)

(1)字段不可變

  • record 的字段默認(rèn)是 final,不能被修改。
  • 如果需要可變字段,不能使用 record

(2)繼承限制

  • record 不能繼承其他類(因?yàn)樗请[式 final 的)。
  • 它的本質(zhì)是一種語(yǔ)法糖,編譯器幫你自動(dòng)生成如下內(nèi)容:
public final class Point extends java.lang.Record {
    private final int x;
    private final int y;
    // 自動(dòng)生成構(gòu)造方法、getters、toString、equals、hashCode 等
}

record 可以實(shí)現(xiàn)接口。

public record Point(int x, int y) implements Serializable {}

(3)不適合復(fù)雜邏輯

record 主要用于簡(jiǎn)單的數(shù)據(jù)載體,不適合包含復(fù)雜的業(yè)務(wù)邏輯。

(4)兼容性

  • record 需要 JDK 14 或更高版本。
  • 如果你的項(xiàng)目需要兼容低版本 JDK,則不能使用 record

7. 總結(jié)

優(yōu)點(diǎn)

  • 減少樣板代碼。
  • 提高代碼可讀性和維護(hù)性。自動(dòng)生成常用方法(如 equals()、hashCode()toString())。

適用場(chǎng)景

  • 封裝簡(jiǎn)單數(shù)據(jù)結(jié)構(gòu)。
  • 配置類。
  • DTO(數(shù)據(jù)傳輸對(duì)象)。

限制

  • 字段不可變。
  • 不能繼承其他類。
  • 不適合復(fù)雜邏輯。

到此這篇關(guān)于Java中的record詳解的文章就介紹到這了,更多相關(guān)Java record內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析JVM逃逸的原理及分析

    淺析JVM逃逸的原理及分析

    在本篇文章里我們給大家分享了JVM逃逸的原理及分析的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的讀者們可以學(xué)習(xí)下。
    2018-10-10
  • Eclipse安裝Aptana插件(注意對(duì)應(yīng)版本問(wèn)題)

    Eclipse安裝Aptana插件(注意對(duì)應(yīng)版本問(wèn)題)

    這篇文章主要為大家詳細(xì)介紹了Eclipse安裝Aptana插件的相關(guān)資料,特別注意對(duì)應(yīng)版本問(wèn)題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Spring多對(duì)象引入方法

    Spring多對(duì)象引入方法

    今天小編就為大家分享一篇關(guān)于Spring多對(duì)象引入方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Java中filter用法完整代碼示例

    Java中filter用法完整代碼示例

    這篇文章主要介紹了Java中filter用法完整代碼示例,分享了瀏覽器不緩存頁(yè)面的過(guò)濾器,檢測(cè)用戶是否登陸的過(guò)濾器等相關(guān)實(shí)例,小編覺(jué)得還是挺不錯(cuò)的,這里分享給大家,需要的朋友可以參考下
    2018-01-01
  • SpringBoot參數(shù)校驗(yàn)Validator框架詳解

    SpringBoot參數(shù)校驗(yàn)Validator框架詳解

    Validator框架就是為了解決開(kāi)發(fā)人員在開(kāi)發(fā)的時(shí)候少寫(xiě)代碼,提升開(kāi)發(fā)效率,Validator專門用來(lái)進(jìn)行接口參數(shù)校驗(yàn),今天通過(guò)本文給大家介紹SpringBoot參數(shù)校驗(yàn)Validator框架,感興趣的朋友一起看看吧
    2022-06-06
  • Java遞歸簡(jiǎn)單實(shí)現(xiàn)n的階乘

    Java遞歸簡(jiǎn)單實(shí)現(xiàn)n的階乘

    這篇文章主要介紹了Java遞歸簡(jiǎn)單實(shí)現(xiàn)n的階乘,遞歸(recursion)就是子程序(或函數(shù))直接調(diào)用自己或通過(guò)一系列調(diào)用語(yǔ)句間接調(diào)用自己,是一種描述問(wèn)題和解決問(wèn)題的基本方法,下面我們舉一個(gè)小小的例子詳情了解一下,需要的朋友可以參考下
    2021-12-12
  • Java計(jì)算兩個(gè)日期時(shí)間之間的天數(shù)最簡(jiǎn)方法

    Java計(jì)算兩個(gè)日期時(shí)間之間的天數(shù)最簡(jiǎn)方法

    這篇文章給大家分享了Java計(jì)算兩個(gè)日期時(shí)間之間的天數(shù)最簡(jiǎn)單的實(shí)現(xiàn)方法,有興趣的朋友可以參考學(xué)習(xí)下。
    2018-07-07
  • java 矩陣乘法的mapreduce程序?qū)崿F(xiàn)

    java 矩陣乘法的mapreduce程序?qū)崿F(xiàn)

    這篇文章主要介紹了java 矩陣乘法的mapreduce程序?qū)崿F(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • SpringSessionRedis配置及發(fā)現(xiàn)的問(wèn)題講解

    SpringSessionRedis配置及發(fā)現(xiàn)的問(wèn)題講解

    今天小編就為大家分享一篇關(guān)于SpringSessionRedis配置及發(fā)現(xiàn)的問(wèn)題講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • 當(dāng)事務(wù)Transactional遇見(jiàn)異步線程出現(xiàn)的坑及解決

    當(dāng)事務(wù)Transactional遇見(jiàn)異步線程出現(xiàn)的坑及解決

    這篇文章主要介紹了當(dāng)事務(wù)Transactional遇見(jiàn)異步線程出現(xiàn)的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評(píng)論