Java Record簡介
在Java中,隨著JDK 14引入的方案封閉特性(Preview Feature),在JDK 16中,Record成為了一種正式的特性。Record類型為Java程序員提供了一種更加簡潔和有效的方式來定義數(shù)據類。本文將詳細探討Java Record的使用,并通過代碼示例幫助大家更好地理解其特性。
什么是Java Record?
Java Record是一種特殊的類,旨在簡化與數(shù)據傳輸對象(DTO)相關的工作。與傳統(tǒng)類相比,Record提供了更少的樣板代碼和更好的表達能力。Record自動實現(xiàn)了equals、hashCode、toString等方法,這使得我們不再需要為簡單的數(shù)據容器類型編寫冗長的代碼。
Record的基本語法
使用Record非常簡單。以下是Record的基本語法:
public record Person(String name, int age) {}在這個例子中,我們定義了一個名為Person的Record,它包含兩個屬性:name(字符串類型)和age(整型)。編譯器將自動生成構造函數(shù)、getter方法、equals、hashCode和toString方法。
使用Record的優(yōu)勢
使用Record的優(yōu)勢主要體現(xiàn)在以下幾個方面:
- 減少樣板代碼:Record自動生成常用方法,減少了樣板代碼的編寫。
- 不可變性:Record的屬性默認是final的,因此對象在創(chuàng)建后無法更改,確保數(shù)據的一致性和安全性。
- 易于維護:由于Record的簡潔性,代碼更易于理解和維護。
一、Record 的誕生背景
Java 的 Record(記錄類)是 Java 14 引入的預覽特性,于 Java 16 正式標準化。其設計初衷是簡化不可變數(shù)據類的定義,解決傳統(tǒng) POJO 類中大量樣板代碼(如構造器、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;
// 構造器、getter、equals、hashCode、toString...
}
// Record 等效實現(xiàn)(1 行)
public record Person(int id, String name) {}通過 Record,開發(fā)者可以專注于數(shù)據本身,而非重復的模板代碼。
二、Record 的核心特性
不可變性
- Record 的所有字段默認是
final的,創(chuàng)建后不可修改,天然線程安全。 - 適用于 DTO、配置項等需要數(shù)據一致性的場景。
- Record 的所有字段默認是
自動生成方法
- 編譯器自動生成以下方法:
- 全參構造器
- 字段訪問器(如
id()、name(),而非getId()) equals()、hashCode()、toString()。
- 編譯器自動生成以下方法:
簡潔語法
- 使用
record關鍵字定義,語法緊湊:
- 使用
public record Point(int x, int y) {}限制性設計
- 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ù)校驗(緊湊構造器)
通過緊湊構造器實現(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 的進階應用
替代 DTO/VO
- 快速定義 API 響應模型:
public record ApiResponse<T>(int code, String message, T data) {}模式匹配(Java 17+)
- 結合
instanceof解構數(shù)據:
- 結合
Object obj = new Point(3, 4);
if (obj instanceof Point(int x, int y)) {
System.out.println("坐標: (" + x + ", " + y + ")");
}數(shù)據庫映射
- 簡化 JDBC 結果集處理:
try (ResultSet rs = statement.executeQuery()) {
return new User(rs.getInt("id"), rs.getString("name"));
}函數(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 |
|---|---|---|
| 不可變性 | 默認支持 | 需手動添加 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結合,構建更嚴格的類型系統(tǒng)。 - 框架整合:Spring 等框架或默認支持 Record 作為數(shù)據載體。
- 函數(shù)式擴展:與 Stream、Optional 深度結合,提升代碼表現(xiàn)力。
總結
Java Record 通過極簡語法和不可變性,顯著減少了數(shù)據類的樣板代碼,同時提升了代碼安全性和可維護性。其適用于 DTO、模式匹配、函數(shù)式編程等場景。
到此這篇關于Java Record簡介的文章就介紹到這了,更多相關Java Record內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
用C++實現(xiàn)求N!中末尾0的個數(shù)的方法詳解
這篇文章主要介紹了用C++實現(xiàn)求N!中末尾0的個數(shù)的方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07
Java實現(xiàn)的模糊匹配某文件夾下的文件并刪除功能示例
這篇文章主要介紹了Java實現(xiàn)的模糊匹配某文件夾下的文件并刪除功能,涉及java針對目錄與文件的遍歷、匹配、判斷、刪除等相關操作技巧,需要的朋友可以參考下2018-02-02
SpringBoot整合Mybatis與MybatisPlus方法詳細講解
這篇文章主要介紹了SpringBoot整合Mybatis與MybatisPlus方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-01-01
Spring Security和Shiro的相同點與不同點整理
在本篇文章里小編給大家整理的是關于Spring Security和Shiro的相同不同點整理,需要的朋友們可以參考下。2020-02-02
使用TraceId在Spring Cloud中實現(xiàn)線上問題快速定位
在微服務架構中,服務間的互相調用使得問題定位變得復雜,在此背景下,TraceId為我們提供了一個在復雜環(huán)境中追蹤請求路徑和定位問題的工具,本文不僅介紹TraceId的基本概念,還將結合真實場景,為您展示如何在Spring Cloud中應用它2023-09-09
mybatis?resultMap之collection聚集兩種實現(xiàn)方式
本文主要介紹了mybatis?resultMap之collection聚集兩種實現(xiàn)方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-09-09

