一、概述
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 评论