Java的 record 關鍵字是Java 14中引入的一個新的語義特性。record 對于創建小型不可變的對象非常有用。另一方面,Lombok 是一個Java庫,可以自動生成一些已知的模式為Java字節碼。盡管它們都可以用來減少模板代碼,但它們是不同的工具。因此,我們應該在特定情況下使用更適合我們需求的工具。
在這篇文章中,我們將探討各種使用情況,包括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
注解來創建不可變的對象。
@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 是如何以一種非常方便的方式來創建小型、不可變的對象的。讓我們看看如果數據模型需要更多的字段,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
來創建一個具有相同屬性的對象。
StudentBuilder john = StudentBuilder.builder()
.name("John")
.email("xxx@qq.com")
.country("sh")
.age(20)
.build();
如果我們對兩者進行比較,我們可以注意到,使用構建器模式是有利的,可以帶來更干凈的代碼。
總而言之,record 對于較小的對象來說是更好的。雖然,對于有很多字段的對象來說,缺乏創建模式會使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就屬于這種類型。當創建一個@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是不同的工具,有不同的用途。此外,我們發現Lombok更加靈活,它可以用于record 受到限制的場景。
-
數據
+關注
關注
8文章
7030瀏覽量
89038 -
JAVA
+關注
關注
19文章
2967瀏覽量
104758 -
代碼
+關注
關注
30文章
4788瀏覽量
68616
發布評論請先 登錄
相關推薦
評論