欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文了解Java中record和lombok的使用對比

 更新時間:2022年07月21日 09:30:14   作者:指北君  
Java的 record 關(guān)鍵字是Java 14中引入的一個新的語義特性。Lombok 是一個Java庫,可以自動生成一些已知的模式為Java字節(jié)碼。本文我們將探討各種使用情況,包括java record 的一些限制。對于每個例子,我們將看到Lombok如何派上用場,并比較這兩種解決方案

大家好,我是指北君。

Java的 record 關(guān)鍵字是Java 14中引入的一個新的語義特性。record 對于創(chuàng)建小型不可變的對象非常有用。另一方面,Lombok 是一個Java庫,可以自動生成一些已知的模式為Java字節(jié)碼。盡管它們都可以用來減少模板代碼,但它們是不同的工具。因此,我們應(yīng)該在特定情況下使用更適合我們需求的工具。

在這篇文章中,我們將探討各種使用情況,包括java record 的一些限制。對于每個例子,我們將看到Lombok如何派上用場,并比較這兩種解決方案。

小型不可變對象

我們的第一個例子,將使用Color對象。一個Color由三個整數(shù)值組成,分別代表紅、綠、藍(lán)三個通道。此外,一個顏色會暴露出它的十六進(jìn)制表示。例如,RGB(255,0,0)的顏色將有一個#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注解來創(chuàng)建不可變的對象。

@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而完全隱藏三個整數(shù)字段。

然而,Lombok允許我們自定義名稱、訪問級別和獲取器的返回類型。讓我們相應(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ù)對象,record 是一個很好的解決方案。

然而,如果我們想隱藏成員字段,只暴露使用它們進(jìn)行的一些操作,Lombok會更適合。

有許多字段的類

我們已經(jīng)看到了record 是如何以一種非常方便的方式來創(chuàng)建小型、不可變的對象的。讓我們看看如果數(shù)據(jù)模型需要更多的字段,record 會是什么樣子。在這個例子中,讓我們考慮Student的數(shù)據(jù)模型。

public?record?StudentRecord(
??String?name,?
??Long?studentId,?
??String?email,?
??String?phoneNumber,?
??String?address,?
??String?country,?
??int?age)?{
}

我們已經(jīng)可以猜到,StudentRecord的實例化將很難閱讀和理解,尤其是如果有些字段不是強(qiáng)制性的。

StudentRecord?john?=?new?StudentRecord(
??"John",?null,?"xxxx@qq.com",?null,?null,?"sh",?20);

為了方便這些使用,Lombok提供了一個[Builder設(shè)計模式](/creational-design-patterns#builder)的實現(xiàn)。

為了使用它,我們只需要用@Builder:來注釋我們的類。

@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來創(chuàng)建一個具有相同屬性的對象。

StudentBuilder?john?=?StudentBuilder.builder()
??.name("John")
??.email("xxx@qq.com")
??.country("sh")
??.age(20)
??.build();

如果我們對兩者進(jìn)行比較,我們可以注意到,使用構(gòu)建器模式是有利的,可以帶來更干凈的代碼。

總而言之,record 對于較小的對象來說是更好的。雖然,對于有很多字段的對象來說,缺乏創(chuàng)建模式會使Lombok的@Builder成為更好的選擇。

可變數(shù)據(jù)

我們可以使用java record 專門處理不可變的數(shù)據(jù)。如果上下文需要一個可變的java對象,我們可以使用Lombok的@Data對象代替:

????@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ù)的對象。例如,Hibernate就屬于這種類型。當(dāng)創(chuàng)建一個@Entity時,我們必須使用Lombok的注解或純Java。

繼承性

Java record 不支持繼承。因此,它們不能被擴(kuò)展或繼承其他類。另一方面,Lombok的@Value對象可以擴(kuò)展其他類,但它們是最終的。

@Value
public?class?MonochromeColor?extends?ColorData?{
????
????public?MonochromeColor(int?grayScale)?{
????????super(grayScale,?grayScale,?grayScale);
????}
}

此外,@Data對象既可以擴(kuò)展其他類,也可以被擴(kuò)展??傊?,如果我們需要繼承,我們應(yīng)該堅持使用Lombok的解決方案。

結(jié)論

在這篇文章中,我們已經(jīng)看到Lombok和java records是不同的工具,有不同的用途。此外,我們發(fā)現(xiàn)Lombok更加靈活,它可以用于record 受到限制的場景。

以上就是一文了解Java中record和lombok的使用對比的詳細(xì)內(nèi)容,更多關(guān)于Java record lombok的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 并發(fā)編程之Java內(nèi)存模型

    并發(fā)編程之Java內(nèi)存模型

    這篇文章主要介紹了Java并發(fā)編程之內(nèi)存模型,Java內(nèi)存模型中的順序一致性,主要介紹重排序與順序一致性內(nèi)存模型,下面文章將圍繞Java內(nèi)存模型展開內(nèi)容,需要的小伙伴可以參考一下
    2021-11-11
  • SpringBoot實現(xiàn)攔截器、過濾器、監(jiān)聽器過程解析

    SpringBoot實現(xiàn)攔截器、過濾器、監(jiān)聽器過程解析

    這篇文章主要介紹了SpringBoot實現(xiàn)攔截器、過濾器、監(jiān)聽器過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Java中LinkedList的模擬實現(xiàn)

    Java中LinkedList的模擬實現(xiàn)

    本文主要介紹了Java中LinkedList的模擬實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • spring-boot-thin-launcher插件分離jar包的依賴和配置方式

    spring-boot-thin-launcher插件分離jar包的依賴和配置方式

    這篇文章主要介紹了spring-boot-thin-launcher插件分離jar包的依賴和配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 淺談java 重寫equals方法的種種坑

    淺談java 重寫equals方法的種種坑

    這篇文章主要介紹了淺談java 重寫equals方法的種種“坑”,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Jackson 反序列化時實現(xiàn)大小寫不敏感設(shè)置

    Jackson 反序列化時實現(xiàn)大小寫不敏感設(shè)置

    這篇文章主要介紹了Jackson 反序列化時實現(xiàn)大小寫不敏感設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 關(guān)于Java中常見的負(fù)載均衡算法

    關(guān)于Java中常見的負(fù)載均衡算法

    這篇文章主要介紹了關(guān)于Java中常見的負(fù)載均衡算法,負(fù)載平衡是一種電子計算機(jī)技術(shù),用來在多個計算機(jī)、網(wǎng)絡(luò)連接、CPU、磁盤驅(qū)動器或其他資源中分配負(fù)載,以達(dá)到優(yōu)化資源使用、最大化吞吐率、最小化響應(yīng)時間、同時避免過載的目的,需要的朋友可以參考下
    2023-08-08
  • Java加密解密工具(適用于JavaSE/JavaEE/Android)

    Java加密解密工具(適用于JavaSE/JavaEE/Android)

    這篇文章主要介紹了Java加密解密工具,適用于JavaSE/JavaEE/Android,感興趣的小伙伴們可以參考一下
    2016-04-04
  • JAVA String.valueOf()方法的用法說明

    JAVA String.valueOf()方法的用法說明

    這篇文章主要介紹了JAVA String.valueOf()方法的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Struts2學(xué)習(xí)手冊之文件上傳基礎(chǔ)教程

    Struts2學(xué)習(xí)手冊之文件上傳基礎(chǔ)教程

    Struts2提供的文件上傳下載機(jī)制十分簡便,使得我們寫很少的代碼,下面這篇文章主要給大家介紹了關(guān)于Struts2學(xué)習(xí)手冊之文件上傳的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-05-05

最新評論