拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Java 14 中的 Lombok

Java 14 中的 Lombok

白鹭 - 2022-07-12 2155 0 2

一、概述

Java 的记录关键字是 Java 14 中引入的新语义特性。 记录对于创建小的不可变对象非常有用。 另一方面, Lombok 是一个 Java 库,可以自动生成一些已知模式作为 Java 字节码。 尽管它们都可以用来减少样板代码,但它们是不同的工具。 因此,我们应该在给定的上下文中使用更适合我们需求的那个。

在本文中,我们将探讨各种用例,包括 java 记录的一些限制。 对于每个示例,我们将了解 Lombok 如何派上用场并比较两种解决方案。

2. 小的不可变对象

对于我们的第一个示例,我们将使用对象。 由三个整数值组成,分别代表红色、绿色和蓝色通道。 此外,颜色将暴露其十六进制表示。 例如, 的颜色将具有的十六进制表示。 此外,如果两种颜色具有相同的 RGB 值,我们希望它们 。ColorColorRGB(255,0,0)#FF0000equal

由于这些原因,在这种情况下选择将非常有意义: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 开始, 将成为这些用例的自然方式。records

3. 透明的数据载体

根据 JDK 增强提案 (JEP 395 ),记录是充当不可变数据的透明载体的类。 因此,我们无法阻止记录公开其成员字段。 例如,我们不能强制前面示例中的只公开并完全隐藏三个整数字段。ColorRecordhexString

但是,Lombok 允许我们自定义 getter 的名称、访问级别和返回类型。 让相应更新 :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);
 }
 }

因此,如果我们需要不可变的数据对象,记录是一个很好的解决方案。

但是,如果我们想隐藏成员字段并只公开使用它们执行的一些操作,Lombok 将更适合。

4.多领域的类

我们已经看到记录是如何代表一种非常方便的方式来创建小的、不可变的对象的。 让我们看看如果数据模型需要更多字段,记录会是什么样子。 对于此示例,让我们考虑数据模型:Student

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

我们已经可以猜到 StudentRecord 的实例化将难以阅读和理解,特别是如果某些字段不是强制性的:

StudentRecord john = new StudentRecord(
 "John", "Doe", null, "[email protected]", null, null, "England", 20);

为了方便这些用例,Lombok提供了 Builder 设计模式的实现。

为了使用它,我们只需要用@Builder:

@Getter
 @Builder
 public class StudentBuilder {
 private String firstName;
 private String lastName;
 private Long studentId;
 private String email;
 private String phoneNumber;
 private String address;
 private String country;
 private int age;
 }

现在,让我们使用创建一个具有相同属性的对象:StudentBuilder

StudentBuilder john = StudentBuilder.builder()
 .firstName("John")
 .lastName("Doe")
 .email("[email protected]")
 .country("England")
 .age(20)
 .build();

如果我们比较两者,我们会注意到使用构建器模式是有利的,从而导致代码更简洁。

总之,记录更适合较小的对象。 但是,对于具有许多字段的对象,缺少创建模式将使 Lombok 的@Builder成为更好的选择。

5. 可变数据

我们可以将 java 记录专门用于不可变数据。 如果上下文需要一个可变的 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);
 }

 }

一些框架可能需要带有 setter 或默认构造函数的对象。 例如,Hibernate 就属于这一类。 创建我们必须使用 Lombok 的注解或纯 Java。@Entity,

6. 继承

Java 记录不支持继承。 因此,它们不能扩展或继承其他类。 另一方面,Lombok 的对象可以扩展其他类,但它们是最终的:@Value

@Value
 public class MonochromeColor extends ColorData {

 public MonochromeColor(int grayScale) {
 super(grayScale, grayScale, grayScale);
 }
 }

此外, 对象既可以扩展其他类,也可以扩展。 总之,如果我们需要继承,我们应该坚持Lombok的解决方案。 @Data

7.结论

在本文中,我们看到 Lombok 和 java 记录是不同的工具,服务于不同的目的。 此外,我们发现 Lombok 更灵活,可以用于记录有限的场景。


标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *