0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Lombok如何派上用場

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-08 15:39 ? 次閱讀

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

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

小型不可變對象

我們的第一個例子,將使用Color對象。一個Color由三個整數(shù)值組成,分別代表紅、綠、藍三個通道。此外,一個顏色會暴露出它的十六進制表示。例如,RGB(255,0,0)的顏色將有一個#FF0000 的十六進制表示。此外,如果兩種顏色具有相同的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增強建議(JEP 395),record 是作為不可變數(shù)據(jù)的透明載體的類。例如,我們不能強迫前面例子中的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 是一個很好的解決方案。

然而,如果我們想隱藏成員字段,只暴露使用它們進行的一些操作,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的實例化將很難閱讀和理解,尤其是如果有些字段不是強制性的。

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();

如果我們對兩者進行比較,我們可以注意到,使用構(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 不支持繼承。因此,它們不能被擴展或繼承其他類。另一方面,Lombok的@Value對象可以擴展其他類,但它們是最終的。

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

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

結(jié)論

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7080

    瀏覽量

    89175
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2971

    瀏覽量

    104853
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4801

    瀏覽量

    68731
收藏 人收藏

    評論

    相關(guān)推薦

    太子獻寶

    `為期兩個月的“奔跑吧2016,資源跨年季”,抽中的工具箱獎品今天收到了,上午收到獎品下午就提著工具箱出門干活了,正好派上用場,工具箱看起來小巧金龍,挺適合外出維修帶上,感覺這個工具箱非常不錯`
    發(fā)表于 02-15 21:34

    TEA加密解密分享!

    不知道大家玩兒過沒,我感覺涉及到安全問題的時候,會派上用場。算法原理沒去研究,現(xiàn)在只知道怎么用,還沒用在單片機上,僅僅是在vc下模擬過。算法是移植的,模擬的代碼是自己寫的。代碼里面有注釋,幫助大家使用。vc模擬TEA加密解密.zip (209.98 KB )
    發(fā)表于 10-15 04:37

    如何降低編程的難度

    平時學(xué)習(xí),無論哪行的知識都要看一遍。學(xué)多學(xué)少都沒關(guān)系。 比如我自己,連財會也看過,盡管我是學(xué)理科的。沒想到竟然能派上用場。 語文數(shù)學(xué)是萬物的基礎(chǔ)知識,要永遠保持在80分以上,點高點低都看這個。
    發(fā)表于 06-08 18:18

    IMS馬達&軟件&控制器及培訓(xùn)資料.part1

    工廠內(nèi)部的一些資料,資料有點老,不知道能不能派上用場。
    發(fā)表于 03-15 14:51 ?3次下載

    IMS馬達&軟件&控制器及培訓(xùn)資料.part2

    工廠內(nèi)部的一些資料,資料有點老,不知道能不能派上用場。
    發(fā)表于 03-15 14:50 ?3次下載

    IMS馬達&軟件&控制器及培訓(xùn)資料.part3

    工廠內(nèi)部的一些資料,資料有點老,不知道能不能派上用場。
    發(fā)表于 03-15 14:50 ?1次下載

    九寨溝地區(qū)發(fā)生7.0級地震,生命探測儀靠什么原理幫助尋人?

    突發(fā)事件尋人服務(wù)是尋人的延伸。最初開發(fā)時,我們希望它最好不要派上用場,但如果需要,它能第一時間發(fā)揮作用。 你們的平安,是今日的頭條。
    發(fā)表于 08-09 08:56 ?4290次閱讀

    工業(yè)物聯(lián)網(wǎng)的發(fā)展得到了哪些技術(shù)的輔助

    網(wǎng)絡(luò)系統(tǒng)是未來智能工廠的基礎(chǔ),但成敗取決于數(shù)據(jù)收集、處理和分析能力,這就是機器視覺派上用場的時候了。
    發(fā)表于 09-23 08:58 ?602次閱讀

    物聯(lián)網(wǎng)在教育行業(yè)可以如何派上用場

    通過將物聯(lián)網(wǎng)集成到教室中,教師可以使用語音或手勢命令遠程管理教室,與遠程位置的學(xué)生建立通信,收集學(xué)生對特定主題的寶貴反饋,并為特殊學(xué)生提供幫助。
    發(fā)表于 04-26 14:43 ?1334次閱讀

    3D打印技術(shù)或?qū)⒃诤I巷L(fēng)力發(fā)電機建設(shè)中派上用場

    南極熊導(dǎo)讀:海上風(fēng)力發(fā)電機的葉片制造、基座建設(shè),3D打印技術(shù)或?qū)⒖梢?b class='flag-5'>派上用場。 GE Renewables的Haliade-X風(fēng)力發(fā)電渦輪機的葉片直徑超過兩個足球場,已經(jīng)是世界上尺寸最大、功率最大
    的頭像 發(fā)表于 01-04 09:41 ?2063次閱讀

    Lombok開發(fā)插件使用小技巧

    0x01:Lombok簡介 Lombok 是一款 Java開發(fā)插件,使得 Java 開發(fā)者可以通過其定義的一些注解來消除業(yè)務(wù)工程中冗長和繁瑣的代碼,尤其對于簡單的 Java 模型對象(POJO)。在
    的頭像 發(fā)表于 06-12 18:07 ?1790次閱讀

    重演自己如何掉入Lombok的戲法陷阱

    ? https://www.ramostear.com/blog/2020/04/28/uk1860p8.html ? 如果您正在閱讀此文,想必您對Project Lombok已經(jīng)有了一段時間的了解
    的頭像 發(fā)表于 10-28 11:29 ?1203次閱讀

    Lombok同時使用@Data和@Builder的一個必須要避開的巨坑

    問題背景 Lombok @Data和@Builder分別單獨分析用法 解決方法 方法一 方法二 Lombok原理 總結(jié) 問題背景 Lombok使? 同時使?@Data和@Builder ,構(gòu)建無參
    的頭像 發(fā)表于 10-11 18:14 ?2017次閱讀

    在LTspice仿真軟件中如何使用FFT進行頻譜分析

    在瞬態(tài)分析中,可以像示波器一樣確認(rèn)時間變化中的信號電平。而如果想確認(rèn)信號中的頻率,F(xiàn)FT 功能將派上用場,通過仿真模擬可以確認(rèn)電路的失真和噪聲成分。
    的頭像 發(fā)表于 02-06 13:45 ?9532次閱讀

    Lombok的使用

    在平時我們工作的時候,我們經(jīng)常會使用 toString() 方法來輸出一個對象的一些屬性信息。Lombok 給我們提供了一個自動生成 toString() 代碼的注解,可以減少代碼行數(shù),如果代碼屬性
    的頭像 發(fā)表于 09-25 14:03 ?801次閱讀