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

Java 14 Lombok库详细介绍

白鹭 - 2022-07-22 2145 0 2

一、概述

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

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

2. 小的不可变对象

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

由于这些原因,在这种情况下选择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 ),记录是充当不可变数据的透明载体的类。因此,我们无法阻止记录公开其成员字段。例如,我们不能强制前面示例中的ColorRecord只公开hexString并完全隐藏三个整数字段。

但是,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 就属于这一类。创建@Entity,我们必须使用Lombok 的注解或纯Java。

6. 继承

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

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

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

7. 结论

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


标签:

0 评论

发表评论

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