Java?Record的實(shí)現(xiàn)示例
一、Record 的誕生背景
Java 的 Record(記錄類)是 Java 14 引入的預(yù)覽特性,于 Java 16 正式標(biāo)準(zhǔn)化。其設(shè)計(jì)初衷是簡(jiǎn)化不可變數(shù)據(jù)類的定義,解決傳統(tǒng) POJO 類中大量樣板代碼(如構(gòu)造器、getter、equals、hashCode、toString 等)的問(wèn)題。例如,一個(gè)簡(jiǎn)單的 Person 類在傳統(tǒng)寫法中需要 30+ 行代碼,而用 Record 只需一行。
傳統(tǒng)類 vs Record 類:
// 傳統(tǒng) POJO(30+ 行)
public class Person {
private final int id;
private final String name;
// 構(gòu)造器、getter、equals、hashCode、toString...
}
// Record 等效實(shí)現(xiàn)(1 行)
public record Person(int id, String name) {}
通過(guò) Record,開發(fā)者可以專注于數(shù)據(jù)本身,而非重復(fù)的模板代碼。
二、Record 的核心特性
不可變性
- Record 的所有字段默認(rèn)是
final的,創(chuàng)建后不可修改,天然線程安全。 - 適用于 DTO、配置項(xiàng)等需要數(shù)據(jù)一致性的場(chǎng)景。
- Record 的所有字段默認(rèn)是
自動(dòng)生成方法
- 編譯器自動(dòng)生成以下方法:
- 全參構(gòu)造器
- 字段訪問(wèn)器(如
id()、name(),而非getId()) equals()、hashCode()、toString()。
- 編譯器自動(dòng)生成以下方法:
簡(jiǎn)潔語(yǔ)法
- 使用
record關(guān)鍵字定義,語(yǔ)法緊湊:public record Point(int x, int y) {}
- 使用
限制性設(shè)計(jì)
- Record 類是隱式
final的,不可被繼承。 - 不能聲明非靜態(tài)實(shí)例字段(僅允許通過(guò)參數(shù)列表定義字段)。
- Record 類是隱式
三、Record 的基本用法
1. 定義與實(shí)例化
public record User(String username, String email) {}
// 實(shí)例化
User user = new User("Alice", "alice@example.com");
System.out.println(user.username()); // 輸出 "Alice"
2. 自定義方法
Record 允許添加自定義方法:
public record Circle(double radius) {
// 計(jì)算面積
public double area() {
return Math.PI * radius * radius;
}
}
3. 參數(shù)校驗(yàn)(緊湊構(gòu)造器)
通過(guò)緊湊構(gòu)造器實(shí)現(xiàn)字段校驗(yàn):
public record Email(String address) {
public Email {
if (!address.contains("@")) {
throw new IllegalArgumentException("Invalid email");
}
}
}
4. 實(shí)現(xiàn)接口與泛型
Record 可以實(shí)現(xiàn)接口,支持泛型:
public record Pair<T, U>(T first, U second) implements Serializable {
public String toJson() {
return "{ \"first\": \"" + first + "\", \"second\": \"" + second + "\" }";
}
}
四、Record 的進(jìn)階應(yīng)用
替代 DTO/VO
- 快速定義 API 響應(yīng)模型:
public record ApiResponse<T>(int code, String message, T data) {}
- 快速定義 API 響應(yīng)模型:
模式匹配(Java 17+)
- 結(jié)合
instanceof解構(gòu)數(shù)據(jù):Object obj = new Point(3, 4); if (obj instanceof Point(int x, int y)) { System.out.println("坐標(biāo): (" + x + ", " + y + ")"); }
- 結(jié)合
數(shù)據(jù)庫(kù)映射
- 簡(jiǎn)化 JDBC 結(jié)果集處理:
try (ResultSet rs = statement.executeQuery()) { return new User(rs.getInt("id"), rs.getString("name")); }
- 簡(jiǎn)化 JDBC 結(jié)果集處理:
函數(shù)式編程
- 作為輕量級(jí)元組(如
Pair、Triple):record Pair<A, B>(A first, B second) {} List<Pair<String, Integer>> pairs = List.of(new Pair<>("Java", 1995));
- 作為輕量級(jí)元組(如
五、Record 與 Lombok 的對(duì)比
| 特性 | Record | Lombok |
|---|---|---|
| 不可變性 | 默認(rèn)支持 | 需手動(dòng)添加 final |
| 代碼生成 | 語(yǔ)言原生支持 | 依賴注解處理器 |
| 模式匹配 | 完全兼容 | 不支持 |
| 兼容性 | 需 JDK 16+ | 兼容舊版本 |
| 可變性 | 不可變 | 支持可變類(如 @Data) |
選擇建議:
- 優(yōu)先 Record:需不可變類、使用模式匹配或 JDK 16+ 環(huán)境。
- 選擇 Lombok:需可變類或兼容舊代碼。
六、注意事項(xiàng)
不可繼承性
- Record 不能繼承其他類(隱式繼承
java.lang.Record)。
- Record 不能繼承其他類(隱式繼承
字段限制
- 所有字段必須通過(guò)參數(shù)列表聲明,不支持動(dòng)態(tài)添加實(shí)例字段。
序列化
- 需顯式實(shí)現(xiàn)
Serializable接口。
- 需顯式實(shí)現(xiàn)
框架兼容性
- 部分框架(如舊版 Spring)可能需適配 Record 類型。
七、未來(lái)展望
- 模式匹配增強(qiáng):與
sealed class結(jié)合,構(gòu)建更嚴(yán)格的類型系統(tǒng)。 - 框架整合:Spring 等框架或默認(rèn)支持 Record 作為數(shù)據(jù)載體。
- 函數(shù)式擴(kuò)展:與 Stream、Optional 深度結(jié)合,提升代碼表現(xiàn)力。
總結(jié)
Java Record 通過(guò)極簡(jiǎn)語(yǔ)法和不可變性,顯著減少了數(shù)據(jù)類的樣板代碼,同時(shí)提升了代碼安全性和可維護(hù)性。其適用于 DTO、模式匹配、函數(shù)式編程等場(chǎng)景。
到此這篇關(guān)于Java Record的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Java Record內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java常見(jiàn)面試題以及答案匯總大全(2025最新版)
這篇文章主要介紹了Java常見(jiàn)面試題及答案匯總的相關(guān)資料,適合準(zhǔn)備求職、或者有跳槽想法的初/中/高級(jí)程序員,也合適想要對(duì)自己技術(shù)棧查缺補(bǔ)漏、不斷完善成長(zhǎng)的人,需要的朋友可以參考下2026-04-04
JAVA中split函數(shù)的常見(jiàn)用法實(shí)例
Java中我們可以利用split把字符串按照指定的分割符進(jìn)行分割,然后返回字符串?dāng)?shù)組,下面這篇文章主要給大家介紹了關(guān)于JAVA中split函數(shù)的常見(jiàn)用法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
Java語(yǔ)言實(shí)現(xiàn)反轉(zhuǎn)鏈表代碼示例
這篇文章主要介紹了Java語(yǔ)言實(shí)現(xiàn)反轉(zhuǎn)鏈表代碼示例,小編覺(jué)得挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-10-10
Spring Boot配置線程池拒絕策略的場(chǎng)景分析(妥善處理好溢出的任務(wù))
本文通過(guò)實(shí)例代碼給大家介紹下如何為線程池配置拒絕策略、如何自定義拒絕策略。對(duì)Spring Boot配置線程池拒絕策略的相關(guān)知識(shí)感興趣的朋友一起看看吧2021-09-09
Mybatis中foreach標(biāo)簽帶來(lái)的空格\換行\(zhòng)回車問(wèn)題及解決方案
這篇文章主要介紹了解決Mybatis中foreach標(biāo)簽帶來(lái)的空格,換行,回車問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
Spring實(shí)現(xiàn)內(nèi)置監(jiān)聽(tīng)器
這篇文章主要介紹了Spring 實(shí)現(xiàn)自定義監(jiān)聽(tīng)器案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧,希望能給你帶來(lái)幫助2021-07-07
java實(shí)現(xiàn)賬號(hào)登錄時(shí)發(fā)送郵件通知
這篇文章主要為大家詳細(xì)介紹了java如何實(shí)現(xiàn)在賬號(hào)登錄時(shí)發(fā)送郵件通知的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-09-09

