Java Record基本用法詳解
一、Record 的誕生背景
Java 的 Record(記錄類)是 Java 14 引入的預(yù)覽特性,于 Java 16 正式標(biāo)準(zhǔn)化。其設(shè)計初衷是簡化不可變數(shù)據(jù)類的定義,解決傳統(tǒng) POJO 類中大量樣板代碼(如構(gòu)造器、getter、equals、hashCode、toString 等)的問題。例如,一個簡單的 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 等效實現(xiàn)(1 行) public record Person(int id, String name) {}
通過 Record,開發(fā)者可以專注于數(shù)據(jù)本身,而非重復(fù)的模板代碼。
二、Record 的核心特性
不可變性
- Record 的所有字段默認(rèn)是
final
的,創(chuàng)建后不可修改,天然線程安全。 - 適用于 DTO、配置項等需要數(shù)據(jù)一致性的場景。
- Record 的所有字段默認(rèn)是
自動生成方法
- 編譯器自動生成以下方法:
- 全參構(gòu)造器
- 字段訪問器(如
id()
、name()
,而非getId()
) equals()
、hashCode()
、toString()
。
- 編譯器自動生成以下方法:
簡潔語法
- 使用
record
關(guān)鍵字定義,語法緊湊:public record Point(int x, int y) {}
- 使用
限制性設(shè)計
- Record 類是隱式
final
的,不可被繼承。 - 不能聲明非靜態(tài)實例字段(僅允許通過參數(shù)列表定義字段)。
- Record 類是隱式
三、Record 的基本用法
1. 定義與實例化
public record User(String username, String email) {} // 實例化 User user = new User("Alice", "alice@example.com"); System.out.println(user.username()); // 輸出 "Alice"
2. 自定義方法
Record 允許添加自定義方法:
public record Circle(double radius) { // 計算面積 public double area() { return Math.PI * radius * radius; } }
3. 參數(shù)校驗(緊湊構(gòu)造器)
通過緊湊構(gòu)造器實現(xiàn)字段校驗:
public record Email(String address) { public Email { if (!address.contains("@")) { throw new IllegalArgumentException("Invalid email"); } } }
4. 實現(xiàn)接口與泛型
Record 可以實現(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ù)庫映射
- 簡化 JDBC 結(jié)果集處理:
try (ResultSet rs = statement.executeQuery()) { return new User(rs.getInt("id"), rs.getString("name")); }
- 簡化 JDBC 結(jié)果集處理:
函數(shù)式編程
- 作為輕量級元組(如
Pair
、Triple
):record Pair<A, B>(A first, B second) {} List<Pair<String, Integer>> pairs = List.of(new Pair<>("Java", 1995));
- 作為輕量級元組(如
五、Record 與 Lombok 的對比
特性 | Record | Lombok |
---|---|---|
不可變性 | 默認(rèn)支持 | 需手動添加 final |
代碼生成 | 語言原生支持 | 依賴注解處理器 |
模式匹配 | 完全兼容 | 不支持 |
兼容性 | 需 JDK 16+ | 兼容舊版本 |
可變性 | 不可變 | 支持可變類(如 @Data ) |
選擇建議:
- 優(yōu)先 Record:需不可變類、使用模式匹配或 JDK 16+ 環(huán)境。
- 選擇 Lombok:需可變類或兼容舊代碼。
六、注意事項
不可繼承性
- Record 不能繼承其他類(隱式繼承
java.lang.Record
)。
- Record 不能繼承其他類(隱式繼承
字段限制
- 所有字段必須通過參數(shù)列表聲明,不支持動態(tài)添加實例字段。
序列化
- 需顯式實現(xiàn)
Serializable
接口。
- 需顯式實現(xiàn)
框架兼容性
- 部分框架(如舊版 Spring)可能需適配 Record 類型。
七、未來展望
- 模式匹配增強:與
sealed class
結(jié)合,構(gòu)建更嚴(yán)格的類型系統(tǒng)。 - 框架整合:Spring 等框架或默認(rèn)支持 Record 作為數(shù)據(jù)載體。
- 函數(shù)式擴展:與 Stream、Optional 深度結(jié)合,提升代碼表現(xiàn)力。
總結(jié)
Java Record 通過極簡語法和不可變性,顯著減少了數(shù)據(jù)類的樣板代碼,同時提升了代碼安全性和可維護(hù)性。其適用于 DTO、模式匹配、函數(shù)式編程等場景。
到此這篇關(guān)于Java Record基本用法詳解的文章就介紹到這了,更多相關(guān)Java Record內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于maven pom文件配置加載lib下的jar包
在項目中引用放置在lib文件夾中的第三方j(luò)ar包需要通過POM文件進(jìn)行特定配置,雖然將依賴放置在公司的Maven私服是更好的做法,但如果遇到部署問題,可以利用maven-jar-plugin進(jìn)行配置,Spring Boot項目可以通過特定設(shè)置來實現(xiàn)2024-09-09淺析如何在IDEA中高效使用Test注解進(jìn)行單元測試
在軟件開發(fā)過程中,單元測試是保證代碼質(zhì)量的重要手段之一,那么如何在IDEA中高效使用Test注解進(jìn)行單元測試呢,下面小編就來和大家簡單講講2025-04-04Java class文件格式之訪問標(biāo)志信息_動力節(jié)點Java學(xué)院整理
access_flags 描述的是當(dāng)前類(或者接口)的訪問修飾符, 如public, private等, 此外, 這里面還存在一個標(biāo)志位, 標(biāo)志當(dāng)前的額這個class描述的是類, 還是接口2017-06-06基于spring+hibernate+JQuery開發(fā)之電子相冊(附源碼下載)
本篇文章介紹了,基于spring+hibernate+JQuery開發(fā)之電子相冊(附源碼下載)。需要的朋友參考下2013-05-05Java8 用Lambda表達(dá)式給List集合排序的實現(xiàn)
這篇文章主要介紹了Java8 用Lambda表達(dá)式給List集合排序的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08解決MyEclipse出現(xiàn)the user operation is waiting的問題
今天做項目的時候每次修改代碼保存后都會跳出一個框框,然后就有兩個進(jìn)度條,上面寫the user operation is wating...小編去網(wǎng)上查了查解決了這個問題,下面跟大家分享一下。2018-04-04