JDK21中Record的用法全方位講解(附完整示例)
前言
record 是 Java 16 正式引入的新語法,用來編寫輕量級、只包含數(shù)據(jù)的不可變類。
到了 JDK 21,record 已經(jīng)非常成熟,并且配合模式匹配(Pattern Matching)可以寫出更簡潔的代碼。
本文將從基礎(chǔ)語法、構(gòu)造器、方法、自定義校驗到 JDK21 新特性全方位講解 record 的使用方式。
1. 什么是 Record?
record 用來創(chuàng)建 不可變數(shù)據(jù)類(data carrier class)。
它會自動幫你生成:
private final字段構(gòu)造器
equals()hashCode()toString()getter(無前綴,方法名就是字段名)
2. Record 的基本使用
public record User(String name, int age) { }
使用方式:
User u = new User("Alice", 20);
System.out.println(u.name()); // Alice
System.out.println(u.age()); // 20
3. 自動生成的內(nèi)容
假設(shè)你寫了:
public record User(String name, int age) { }
Java 會自動生成等價于:
private final String name;
private final int age;
public User(String name, int age) { ... }
public String name() { return name; }
public int age() { return age; }
public boolean equals(Object o) { ... }
public int hashCode() { ... }
public String toString() { ... }
你完全不需要自己寫!
4. Record 的構(gòu)造器用法
(1)規(guī)范構(gòu)造器(Canonical Constructor)
你可以給 record 添加校驗邏輯:
public record User(String name, int age) {
public User {
if (age < 0) {
throw new IllegalArgumentException("age must be >= 0");
}
}
}
這是最常用的方式。
(2)額外構(gòu)造器(Overloaded Constructor)
public record Point(int x, int y) {
public Point(int value) {
this(value, value);
}
}5. 在 Record 中定義方法
record 和普通類一樣可以添加方法:
public record User(String name, int age) {
public String info() {
return name + " (" + age + ")";
}
}
6. Record 中允許與不允許的內(nèi)容
允許的內(nèi)容
定義方法
定義靜態(tài)字段、靜態(tài)方法
實現(xiàn)接口
重寫構(gòu)造器
使用注解
不允許的內(nèi)容
不能繼承其他類(但可以實現(xiàn)接口)
不能定義可變字段(如
int x;)不能定義 setter
例如:
public record User(String name) {
private int age; // ? 編譯錯誤
}
7. Record 是否真的不可變?(深淺不可變問題)
record 提供的是淺不可變:字段本身是 final,但字段內(nèi)部對象可以變。
例子:
public record Order(String id, List<String> items) { }
Order o = new Order("1", new ArrayList<>(List.of("A", "B")));
o.items().add("C"); // ?Allowed(內(nèi)部 List 可以變)
如果你需要深不可變,可以在構(gòu)造器里拷貝:
public record Order(String id, List<String> items) {
public Order {
items = List.copyOf(items);
}
}
8. Record 搭配 sealed(JDK21 完整支持)
在 JDK21 中,你可以把 record 放進 sealed 層級結(jié)構(gòu):
public sealed interface Shape permits Circle, Rectangle { }
public record Circle(double r) implements Shape { }
public record Rectangle(double w, double h) implements Shape { }
這讓 record 特別適合建模領(lǐng)域?qū)ο螅―DD)。
9. Record 模式匹配(Pattern Matching)→ JDK21 新特性
從 JDK 21 開始,switch 可以直接解構(gòu) record:
record Point(int x, int y) {}
static String format(Object o) {
return switch (o) {
case Point(int x, int y) -> "Point: " + x + "," + y;
default -> "Unknown";
};
}
這讓 record 使用起來更像 Kotlin 的 data class。
10. 總結(jié)
| 能力 | 是否支持 |
|---|---|
| 自動生成構(gòu)造器、equals、hashCode、toString | ? |
| 字段不可變(final) | ? |
| 深不可變 | ?(需要自己處理) |
| 實現(xiàn)接口 | ? |
| 繼承類 | ? |
| 自定義構(gòu)造器 | ? |
| 模式匹配(JDK21) | ? |
Record 的核心價值:少寫大量模板代碼,寫出更簡潔、安全的數(shù)據(jù)類。
到此這篇關(guān)于JDK21中Record用法全方位講解的文章就介紹到這了,更多相關(guān)JDK21中Record用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Security 技術(shù)原理與實戰(zhàn)全解析
SpringSecurity是Spring生態(tài)的安全框架,提供認(rèn)證、授權(quán)、攻擊防護等功能,基于過濾器鏈和上下文模型,支持可插拔架構(gòu)與聲明式安全控制,適用于分布式和云原生場景,是Java應(yīng)用安全的核心解決方案,本文給大家介紹Spring Security 原理實戰(zhàn),感興趣的朋友一起看看吧2025-06-06
SpringBoot集成Watchdog的完整步驟教學(xué)
這篇文章主要為大家詳細介紹了SpringBoot中集成Watchdog的完整步驟教學(xué),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-09-09
MyBatis-Plus多數(shù)據(jù)源的示例代碼
本文主要介紹了MyBatis-Plus多數(shù)據(jù)源的示例代碼,包括依賴配置、數(shù)據(jù)源配置、Mapper 和 Service 的定義,具有一定的參考價值,感興趣的可以了解一下2024-05-05
SpringBoot項目集成Smart-Doc的實戰(zhàn)指南
Smart-Doc是一款強大的基于Java的API文檔生成工具,它通過對接口源代碼進行分析來生成全面而準(zhǔn)確的文檔,完全不需要對代碼進行任何注入,下面我們看看如何在SpringBoot項目中集成Smart-Doc吧2025-10-10
springboot項目關(guān)閉swagger如何防止漏洞掃描
這篇文章主要介紹了springboot項目關(guān)閉swagger如何防止漏洞掃描,本文通過示例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-05-05
2020年IntelliJ IDEA最新最詳細配置圖文教程詳解
這篇文章主要介紹了2020年IntelliJ IDEA最新最詳細配置圖文教程詳解,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02

