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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Lombok如何派上用場

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

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

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

小型不可變對象

我們的第一個例子,將使用Color對象。一個Color由三個整數值組成,分別代表紅、綠、藍三個通道。此外,一個顏色會暴露出它的十六進制表示。例如,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將成為這些使用情況的最常見的方式。

透明的數據載體

根據JDK增強建議(JEP 395),record 是作為不可變數據的透明載體的類。例如,我們不能強迫前面例子中的ColorRecord只暴露hexString而完全隱藏三個整數字段。

然而,Lombok允許我們自定義名稱、訪問級別和獲取器的返回類型。讓我們相應地更新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);
    }
}

因此,如果我們需要不可變的數據對象,record 是一個很好的解決方案。

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

有許多字段的類

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

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

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

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

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

為了使用它,我們只需要用@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;
}

現在,讓我們使用StudentBuilder來創(chuàng)建一個具有相同屬性的對象。

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

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

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

可變數據

我們可以使用java record 專門處理不可變的數據。如果上下文需要一個可變的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); 
        }

    }

一些框架可能需要帶有設置器或默認構造函數的對象。例如,Hibernate就屬于這種類型。當創(chuàng)建一個@Entity時,我們必須使用Lombok的注解或純Java。

繼承性

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

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

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

結論

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

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

    關注

    8

    文章

    6715

    瀏覽量

    88308
  • JAVA
    +關注

    關注

    19

    文章

    2943

    瀏覽量

    104096
  • 代碼
    +關注

    關注

    30

    文章

    4671

    瀏覽量

    67765
收藏 人收藏

    評論

    相關推薦

    太子獻寶

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

    TEA加密解密分享!

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

    如何降低編程的難度

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

    IMS馬達&軟件&控制器及培訓資料.part1

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

    IMS馬達&軟件&控制器及培訓資料.part2

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

    IMS馬達&軟件&控制器及培訓資料.part3

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

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

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

    工業(yè)物聯網的發(fā)展得到了哪些技術的輔助

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

    物聯網在教育行業(yè)可以如何派上用場

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

    3D打印技術或將在海上風力發(fā)電機建設中派上用場

    南極熊導讀:海上風力發(fā)電機的葉片制造、基座建設,3D打印技術或將可以派上用場。 GE Renewables的Haliade-X風力發(fā)電渦輪機的葉片直徑超過兩個足球場,已經是世界上尺寸最大、功率最大
    的頭像 發(fā)表于 01-04 09:41 ?1977次閱讀

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

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

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

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

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

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

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

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

    Lombok的使用

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