成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java record vs Lombok,誰更勝一籌?

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

大家好,我是指北君。

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增強建議(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 是一個很好的解決方案。

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

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 受到限制的場景。

責(zé)任編輯:武曉燕 來源: Java技術(shù)指北
相關(guān)推薦

2024-07-31 09:39:33

2014-03-06 15:07:41

青橙小米

2020-01-18 14:55:03

架構(gòu)運維技術(shù)

2018-06-12 10:09:41

編程語言PythonJava

2020-03-06 09:21:28

PWA原生應(yīng)用Web

2010-05-28 11:21:17

2017-06-08 15:38:41

2020-02-02 15:42:22

PythonC++編程語言

2017-01-11 14:38:39

編程語言Java

2022-08-24 08:00:00

Node.isJavaScriptDeno

2018-08-15 08:33:33

編程Go語言開發(fā)

2023-08-09 18:08:35

ChatGPTStackOverflow

2017-11-13 15:38:03

VMwareOpenStack混合云

2019-01-04 09:59:14

KafkaRabbitMQMQ

2018-10-12 13:54:26

2025-01-03 09:27:14

2023-04-26 07:34:38

Java并發(fā)編程

2010-07-27 14:36:31

Flex Array

2013-02-19 13:13:33

SurfaceiPad

2010-05-21 16:36:09

GoogleCode
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 91久久久久久久 | 一区二区国产在线观看 | 亚洲九九精品 | 久久里面有精品 | 成人精品一区 | 伊人久久综合 | 亚洲精品久久久久久久久久久久久 | www.日韩系列 | 久久久.com | 亚洲乱码一区二区三区在线观看 | 日韩精品在线免费观看视频 | 国产一区91精品张津瑜 | 蜜桃视频在线观看免费视频网站www | 超碰97人人人人人蜜桃 | 韩日一区二区 | 欧美精品在线免费观看 | 亚洲国产欧美日韩 | 精品av天堂毛片久久久借种 | 国产精品自拍一区 | 在线色| 午夜小电影 | 97国产精品视频人人做人人爱 | 青青草精品| 欧美一级黑人aaaaaaa做受 | 在线观看中文字幕视频 | 国产日韩欧美一区 | 国产精品视频免费看 | 91精品一区二区三区久久久久 | 日日操夜夜操天天操 | 免费美女网站 | 日韩欧美三区 | 久久久久亚洲精品中文字幕 | 国产精品视频网站 | 激情综合五月天 | 少妇精品久久久久久久久久 | 久久99精品久久久久久青青日本 | 亚洲视频免费在线观看 | h在线播放 | 欧美视频在线播放 | 日韩在线播放第一页 | 久久国产精品视频观看 |