Java中的record使用詳解
1. 什么是 record?
定義:record
是 Java 14 引入的一種新語法(在 Java 16 中成為正式功能),用于定義不可變的數(shù)據(jù)類。
- 目的:簡化那些主要用于存儲數(shù)據(jù)的類的定義,減少樣板代碼。
- 特點:
- 自動實現(xiàn)構(gòu)造函數(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; // 全參構(gòu)造器 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)自動生成方法
- 構(gòu)造函數(shù):根據(jù)字段自動生成全參構(gòu)造函數(shù)。
- getter 方法:為每個字段生成對應(yīng)的 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)簡潔性
- 不需要手動編寫構(gòu)造函數(shù)、getter 方法、
equals()
、hashCode()
和toString()
。 - 適合用來定義簡單的數(shù)據(jù)載體類。
4. 使用場景
(1)封裝簡單數(shù)據(jù)結(jié)構(gòu)
- 當你需要一個類來表示一組不可變的數(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ù)傳輸對象)
- 在微服務(wù)或前后端交互中,
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)自定義構(gòu)造函數(shù)
你可以通過緊湊構(gòu)造函數(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); // 拋出異常
緊湊構(gòu)造函數(shù) 是 record 提供的一種簡潔語法,用于在不手動寫構(gòu)造參數(shù)和賦值的前提下,插入自定義邏輯(如校驗),簡潔高效,專為不可變數(shù)據(jù)對象設(shè)計。
6. 注意事項
(1)字段不可變
record
的字段默認是final
,不能被修改。- 如果需要可變字段,不能使用
record
。
(2)繼承限制
record
不能繼承其他類(因為它是隱式final
的)。- 它的本質(zhì)是一種語法糖,編譯器幫你自動生成如下內(nèi)容:
public final class Point extends java.lang.Record { private final int x; private final int y; // 自動生成構(gòu)造方法、getters、toString、equals、hashCode 等 }
record
可以實現(xiàn)接口。
public record Point(int x, int y) implements Serializable {}
(3)不適合復(fù)雜邏輯
record
主要用于簡單的數(shù)據(jù)載體,不適合包含復(fù)雜的業(yè)務(wù)邏輯。
(4)兼容性
record
需要 JDK 14 或更高版本。- 如果你的項目需要兼容低版本 JDK,則不能使用
record
。
7. 總結(jié)
優(yōu)點:
- 減少樣板代碼。
- 提高代碼可讀性和維護性。自動生成常用方法(如
equals()
、hashCode()
和toString()
)。
適用場景:
- 封裝簡單數(shù)據(jù)結(jié)構(gòu)。
- 配置類。
- DTO(數(shù)據(jù)傳輸對象)。
限制:
- 字段不可變。
- 不能繼承其他類。
- 不適合復(fù)雜邏輯。
到此這篇關(guān)于Java中的record詳解的文章就介紹到這了,更多相關(guān)Java record內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Eclipse安裝Aptana插件(注意對應(yīng)版本問題)
這篇文章主要為大家詳細介紹了Eclipse安裝Aptana插件的相關(guān)資料,特別注意對應(yīng)版本問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02SpringBoot參數(shù)校驗Validator框架詳解
Validator框架就是為了解決開發(fā)人員在開發(fā)的時候少寫代碼,提升開發(fā)效率,Validator專門用來進行接口參數(shù)校驗,今天通過本文給大家介紹SpringBoot參數(shù)校驗Validator框架,感興趣的朋友一起看看吧2022-06-06java 矩陣乘法的mapreduce程序?qū)崿F(xiàn)
這篇文章主要介紹了java 矩陣乘法的mapreduce程序?qū)崿F(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-06-06SpringSessionRedis配置及發(fā)現(xiàn)的問題講解
今天小編就為大家分享一篇關(guān)于SpringSessionRedis配置及發(fā)現(xiàn)的問題講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03當事務(wù)Transactional遇見異步線程出現(xiàn)的坑及解決
這篇文章主要介紹了當事務(wù)Transactional遇見異步線程出現(xiàn)的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12