一文了解Java中record和lombok的使用對(duì)比
大家好,我是指北君。
Java的 record 關(guān)鍵字是Java 14中引入的一個(gè)新的語(yǔ)義特性。record 對(duì)于創(chuàng)建小型不可變的對(duì)象非常有用。另一方面,Lombok 是一個(gè)Java庫(kù),可以自動(dòng)生成一些已知的模式為Java字節(jié)碼。盡管它們都可以用來(lái)減少模板代碼,但它們是不同的工具。因此,我們應(yīng)該在特定情況下使用更適合我們需求的工具。
在這篇文章中,我們將探討各種使用情況,包括java record 的一些限制。對(duì)于每個(gè)例子,我們將看到Lombok如何派上用場(chǎng),并比較這兩種解決方案。
小型不可變對(duì)象
我們的第一個(gè)例子,將使用Color對(duì)象。一個(gè)Color由三個(gè)整數(shù)值組成,分別代表紅、綠、藍(lán)三個(gè)通道。此外,一個(gè)顏色會(huì)暴露出它的十六進(jìn)制表示。例如,RGB(255,0,0)的顏色將有一個(gè)#FF0000 的十六進(jìn)制表示。此外,如果兩種顏色具有相同的RGB值,我們希望它們是相等的。
由于這些原因,在這種情況下選擇 record 是非常合理的。
public?record?ColorRecord(int?red,?int?green,?int?blue)?{
?
????public?String?getHexString()?{
????????return?String.format("#%02X%02X%02X",?red,?green,?blue);
????}
}
同樣地,Lombok允許我們使用@Value注解來(lái)創(chuàng)建不可變的對(duì)象。
@Value
public?class?ColorValueObject?{
????int?red;
????int?green;
????int?blue;
????public?String?getHexString()?{
????????return?String.format("#%02X%02X%02X",?red,?green,?blue);
????}
}
然而,從Java 14開始,record 將成為這些使用情況的最常見的方式。
透明的數(shù)據(jù)載體
根據(jù)JDK增強(qiáng)建議(JEP 395),record 是作為不可變數(shù)據(jù)的透明載體的類。例如,我們不能強(qiáng)迫前面例子中的ColorRecord只暴露hexString而完全隱藏三個(gè)整數(shù)字段。
然而,Lombok允許我們自定義名稱、訪問級(jí)別和獲取器的返回類型。讓我們相應(yīng)地更新ColorValueObject。
@Value
@Getter(AccessLevel.NONE)
public?class?ColorValueObject?{
????int?red;
????int?green;
????int?blue;
????public?String?getHexString()?{
????????return?String.format("#%02X%02X%02X",?red,?green,?blue);
????}
}
因此,如果我們需要不可變的數(shù)據(jù)對(duì)象,record 是一個(gè)很好的解決方案。
然而,如果我們想隱藏成員字段,只暴露使用它們進(jìn)行的一些操作,Lombok會(huì)更適合。
有許多字段的類
我們已經(jīng)看到了record 是如何以一種非常方便的方式來(lái)創(chuàng)建小型、不可變的對(duì)象的。讓我們看看如果數(shù)據(jù)模型需要更多的字段,record 會(huì)是什么樣子。在這個(gè)例子中,讓我們考慮Student的數(shù)據(jù)模型。
public?record?StudentRecord(
??String?name,?
??Long?studentId,?
??String?email,?
??String?phoneNumber,?
??String?address,?
??String?country,?
??int?age)?{
}
我們已經(jīng)可以猜到,StudentRecord的實(shí)例化將很難閱讀和理解,尤其是如果有些字段不是強(qiáng)制性的。
StudentRecord?john?=?new?StudentRecord( ??"John",?null,?"xxxx@qq.com",?null,?null,?"sh",?20);
為了方便這些使用,Lombok提供了一個(gè)[Builder設(shè)計(jì)模式](/creational-design-patterns#builder)的實(shí)現(xiàn)。
為了使用它,我們只需要用@Builder:來(lái)注釋我們的類。
@Getter
@Builder
public?class?StudentBuilder?{
????private?String?name;
????private?Long?studentId;
????private?String?email;
????private?String?phoneNumber;
????private?String?address;
????private?String?country;
????private?int?age;
}
現(xiàn)在,讓我們使用StudentBuilder來(lái)創(chuàng)建一個(gè)具有相同屬性的對(duì)象。
StudentBuilder?john?=?StudentBuilder.builder()
??.name("John")
??.email("xxx@qq.com")
??.country("sh")
??.age(20)
??.build();
如果我們對(duì)兩者進(jìn)行比較,我們可以注意到,使用構(gòu)建器模式是有利的,可以帶來(lái)更干凈的代碼。
總而言之,record 對(duì)于較小的對(duì)象來(lái)說是更好的。雖然,對(duì)于有很多字段的對(duì)象來(lái)說,缺乏創(chuàng)建模式會(huì)使Lombok的@Builder成為更好的選擇。
可變數(shù)據(jù)
我們可以使用java record 專門處理不可變的數(shù)據(jù)。如果上下文需要一個(gè)可變的java對(duì)象,我們可以使用Lombok的@Data對(duì)象代替:
????@Data?
????@AllArgsConstructor?
????public?class?ColorData?{
????????private?int?red;?
????????private?int?green;?
????????private?int?blue;
????????public?String?getHexString()?{?
????????????return?String.format("#%02X%02X%02X",?red,?green,?blue);?
????????}
????}
一些框架可能需要帶有設(shè)置器或默認(rèn)構(gòu)造函數(shù)的對(duì)象。例如,Hibernate就屬于這種類型。當(dāng)創(chuàng)建一個(gè)@Entity時(shí),我們必須使用Lombok的注解或純Java。
繼承性
Java record 不支持繼承。因此,它們不能被擴(kuò)展或繼承其他類。另一方面,Lombok的@Value對(duì)象可以擴(kuò)展其他類,但它們是最終的。
@Value
public?class?MonochromeColor?extends?ColorData?{
????
????public?MonochromeColor(int?grayScale)?{
????????super(grayScale,?grayScale,?grayScale);
????}
}
此外,@Data對(duì)象既可以擴(kuò)展其他類,也可以被擴(kuò)展??傊?,如果我們需要繼承,我們應(yīng)該堅(jiān)持使用Lombok的解決方案。
結(jié)論
在這篇文章中,我們已經(jīng)看到Lombok和java records是不同的工具,有不同的用途。此外,我們發(fā)現(xiàn)Lombok更加靈活,它可以用于record 受到限制的場(chǎng)景。
以上就是一文了解Java中record和lombok的使用對(duì)比的詳細(xì)內(nèi)容,更多關(guān)于Java record lombok的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot集成Druid連接池進(jìn)行SQL監(jiān)控的問題解析
這篇文章主要介紹了SpringBoot集成Druid連接池進(jìn)行SQL監(jiān)控的問題解析,在SpringBoot工程中引入Druid連接池非常簡(jiǎn)單,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-07-07
java并發(fā)編程專題(一)----線程基礎(chǔ)知識(shí)
這篇文章主要介紹了java并發(fā)編程線程的基礎(chǔ)知識(shí),文中講解非常詳細(xì),幫助大家更好的學(xué)習(xí)JAVA并發(fā)編程,感興趣想學(xué)習(xí)JAVA的可以了解下2020-06-06
Spring Hibernate實(shí)現(xiàn)分頁(yè)功能
這篇文章主要為大家詳細(xì)介紹了Spring Hibernate實(shí)現(xiàn)分頁(yè)功能的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
mybatis攔截器實(shí)現(xiàn)通用權(quán)限字段添加的方法
這篇文章主要給大家介紹了關(guān)于mybatis攔截器實(shí)現(xiàn)通用權(quán)限字段添加的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Spring Boot 2 實(shí)戰(zhàn):自定義啟動(dòng)運(yùn)行邏輯實(shí)例詳解
這篇文章主要介紹了Spring Boot 2 實(shí)戰(zhàn):自定義啟動(dòng)運(yùn)行邏輯,結(jié)合實(shí)例形式詳細(xì)分析了Spring Boot 2自定義啟動(dòng)運(yùn)行邏輯詳細(xì)操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-05-05
springboot解決Class path contains multiple 
這篇文章主要介紹了springboot解決Class path contains multiple SLF4J bindings問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
springboot實(shí)現(xiàn)rabbitmq消息確認(rèn)的示例代碼
RabbitMQ的消息確認(rèn)有兩種, 一種是消息發(fā)送確認(rèn),第二種是消費(fèi)接收確認(rèn),本文主要介紹了springboot實(shí)現(xiàn)rabbitmq消息確認(rèn)的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
Struts2實(shí)現(xiàn)對(duì)action請(qǐng)求對(duì)象的攔截操作方法
這篇文章主要介紹了Struts2實(shí)現(xiàn)對(duì)action請(qǐng)求對(duì)象的攔截操作方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-11-11
Java編程二項(xiàng)分布的遞歸和非遞歸實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Java編程二項(xiàng)分布的遞歸和非遞歸實(shí)現(xiàn)代碼實(shí)例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01

