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

Java中的record使用詳解

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

1. 什么是 record?

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

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

2. 基本語法

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

示例

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

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

public final class Point {
    private final int x;
    private final int y;
    // 全參構造器
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    // Getter 方法
    public int x() { return x; }
    public int y() { return y; }
    // 自動覆蓋 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);
    }
    // 自動覆蓋 toString
    @Override
    public String toString() {
        return "Point[x=" + x + ", y=" + y + "]";
    }
}

3. record 的核心特性

(1)字段不可變

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

(2)自動生成方法

  • 構造函數(shù):根據(jù)字段自動生成全參構造函數(shù)。
  • getter 方法:為每個字段生成對應的 getter 方法(名稱與字段名相同)。
  • equals()hashCode()toString():根據(jù)字段自動生成這些方法。

示例

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)簡潔性

  • 不需要手動編寫構造函數(shù)、getter 方法、equals()、hashCode()toString()。
  • 適合用來定義簡單的數(shù)據(jù)載體類。

4. 使用場景

(1)封裝簡單數(shù)據(jù)結構

  • 當你需要一個類來表示一組不可變的數(shù)據(jù)時,可以使用 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ù)傳輸對象)

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

5. 自定義行為

雖然 record 自動生成了許多方法,但你仍然可以對其進行擴展。

(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)自定義構造函數(shù)

你可以通過緊湊構造函數(shù)對字段進行驗證或其他操作。

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); // 拋出異常

緊湊構造函數(shù) 是 record 提供的一種簡潔語法,用于在不手動寫構造參數(shù)和賦值的前提下,插入自定義邏輯(如校驗),簡潔高效,專為不可變數(shù)據(jù)對象設計。

6. 注意事項

(1)字段不可變

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

(2)繼承限制

  • record 不能繼承其他類(因為它是隱式 final 的)。
  • 它的本質是一種語法糖,編譯器幫你自動生成如下內容:
public final class Point extends java.lang.Record {
    private final int x;
    private final int y;
    // 自動生成構造方法、getters、toString、equals、hashCode 等
}

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

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

(3)不適合復雜邏輯

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

(4)兼容性

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

7. 總結

優(yōu)點

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

適用場景

  • 封裝簡單數(shù)據(jù)結構。
  • 配置類。
  • DTO(數(shù)據(jù)傳輸對象)。

限制

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

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

相關文章

  • Spring中的@Scheduled定時任務注解詳解

    Spring中的@Scheduled定時任務注解詳解

    這篇文章主要介紹了Spring中的@Scheduled定時任務注解詳解,要使用@Scheduled注解,首先需要在啟動類添加@EnableScheduling,啟用Spring的計劃任務執(zhí)行功能,這樣可以在容器中的任何Spring管理的bean上檢測@Scheduled注解,執(zhí)行計劃任務,需要的朋友可以參考下
    2023-09-09
  • mybatis的動態(tài)SQL以及連接池詳解

    mybatis的動態(tài)SQL以及連接池詳解

    這篇文章主要介紹了mybatis的動態(tài)SQL以及連接池詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • mybatis插入數(shù)據(jù)不返回主鍵id的可能原因及解決方式

    mybatis插入數(shù)據(jù)不返回主鍵id的可能原因及解決方式

    這篇文章主要介紹了mybatis插入數(shù)據(jù)不返回主鍵id的可能原因及解決方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Java之哈夫曼壓縮原理案例講解

    Java之哈夫曼壓縮原理案例講解

    這篇文章主要介紹了Java之哈夫曼壓縮原理案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • IDEA 程序包不存在,找不到符號但是明明存在對應的jar包(問題分析及解決方案)

    IDEA 程序包不存在,找不到符號但是明明存在對應的jar包(問題分析及解決方案)

    這篇文章主要介紹了IDEA 程序包不存在,找不到符號但是明明存在對應的jar包 的解決方案,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • MultipartFile文件判斷是否存在的操作

    MultipartFile文件判斷是否存在的操作

    這篇文章主要介紹了MultipartFile文件判斷是否存在的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • kafka?消息隊列中點對點與發(fā)布訂閱的區(qū)別說明

    kafka?消息隊列中點對點與發(fā)布訂閱的區(qū)別說明

    這篇文章主要介紹了kafka?消息隊列中點對點與發(fā)布訂閱的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Java中父類強制轉換子類問題解決

    Java中父類強制轉換子類問題解決

    在Java編程中繼承是基礎,但父類轉換為子類時需謹慎,正確的轉換要求父類引用實際指向子類對象,錯誤轉換可能引發(fā)ClassCastException,解決方案包括使用instanceof關鍵字檢查、利用泛型避免轉換、以及通過多態(tài)性避免直接轉換,感興趣的可以了解一下
    2024-11-11
  • Java將byte[]轉圖片存儲到本地的案例

    Java將byte[]轉圖片存儲到本地的案例

    這篇文章主要介紹了Java將byte[]轉圖片存儲到本地的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Springboot Apollo配置yml的問題及解決方案

    Springboot Apollo配置yml的問題及解決方案

    這篇文章主要介紹了Springboot Apollo配置yml的問題及解決方案,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06

最新評論