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

