Java中Record的應(yīng)用小結(jié)
Record是Java 14引入的預(yù)覽特性(Java 16正式發(fā)布),主要用于簡化不可變數(shù)據(jù)載體的建模。其核心價值在于自動生成模板代碼,替代傳統(tǒng)POJO類的繁瑣編寫。
一、核心特性
自動生成方法
編譯器自動生成:final
字段的getter
(方法名即字段名,無get
前綴)equals()
和hashCode()
toString()
- 全字段構(gòu)造器
不可變性
所有字段默認為final
,創(chuàng)建后狀態(tài)不可修改。語法結(jié)構(gòu)
public record 類名(類型1 字段1, 類型2 字段2...) { // 可選:自定義方法/構(gòu)造器 }
二、典型應(yīng)用場景
DTO數(shù)據(jù)傳輸對象
public record UserDTO(String id, String name, LocalDateTime createTime) {}
多返回值方法
替代Map
或臨時類:public record Coordinate(double x, double y) {} public Coordinate calculatePosition() { return new Coordinate(12.5, 8.3); }
模式匹配(Java 17+)
配合instanceof
簡化類型判斷:Object obj = new UserDTO("U001", "Alice", LocalDateTime.now()); if (obj instanceof UserDTO(String id, String name, var time)) { System.out.println(name); // 直接解構(gòu)字段 }
三、與傳統(tǒng)類對比
特性 | Record類 | 傳統(tǒng)POJO類 |
---|---|---|
字段聲明 | 直接在括號內(nèi)聲明 | 顯式聲明+getter/setter |
不可變性 | 默認強制 | 需手動添加final |
代碼量 | 平均減少70%模板代碼 | 冗長 |
繼承 | 隱式繼承Record ,不可繼承其他類 | 可自由繼承 |
可變性擴展 | 不支持 | 可通過setter實現(xiàn) |
四、使用示例
// 定義Record public record Product( String sku, BigDecimal price, int stock ) { // 自定義緊湊構(gòu)造器(驗證邏輯) public Product { Objects.requireNonNull(sku); if (price.compareTo(BigDecimal.ZERO) < 0) throw new IllegalArgumentException("價格不能為負"); } // 自定義方法 public boolean isInStock() { return stock > 0; } } // 使用 Product laptop = new Product("P1001", new BigDecimal("5999.00"), 10); System.out.println(laptop.sku()); // 直接訪問字段 System.out.println(laptop.isInStock());
五、注意事項
- 不適合需要可變狀態(tài)的場景
- 不能繼承其他類(但可實現(xiàn)接口)
- 字段默認
private final
,無法添加實例字段 - 可通過靜態(tài)字段/方法擴展功能
在Java 21中,Record可配合密封接口(sealed interface)實現(xiàn)更安全的代數(shù)數(shù)據(jù)類型(ADT)設(shè)計,適用于領(lǐng)域驅(qū)動開發(fā)(DDD)中的值對象建模。
到此這篇關(guān)于Java中Record的應(yīng)用小結(jié)的文章就介紹到這了,更多相關(guān)Java Record應(yīng)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Idea進行pull的時候Your local changes would be
這篇文章主要介紹了Idea進行pull的時候Your local changes would be overwritten by merge.具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11java反射校驗參數(shù)是否是基礎(chǔ)類型步驟示例
這篇文章主要為大家介紹了java反射校驗參數(shù)是否是基礎(chǔ)類型步驟示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12Java 8中Collectors.toMap空指針異常源碼解析
這篇文章主要為大家介紹了Java 8中Collectors.toMap空指針異常源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08JAVA中StringBuffer與String的區(qū)別解析
這篇文章主要介紹了JAVA中StringBuffer與String的區(qū)別解析,需要的朋友可以參考下2014-02-02Mybatis不支持batchInsertOrUpdate返顯id問題
這篇文章主要介紹了Mybatis不支持batchInsertOrUpdate返顯id問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05淺談spring ioc的注入方式及注入不同的數(shù)據(jù)類型
這篇文章主要介紹了淺談spring ioc的注入方式及注入不同的數(shù)據(jù)類型,具有一定借鑒價值,需要的朋友可以參考下2017-12-12如何將字符串、字節(jié)數(shù)組轉(zhuǎn)為輸入流
這篇文章主要介紹了如何將字符串、字節(jié)數(shù)組轉(zhuǎn)為輸入流問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05