Java record vs Lombok,谁更胜一筹?
大家好,更胜我是更胜指北君。
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的数据模型。b2b信息网
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 受到限制的场景。
相关文章
- 摘要:玉雕作为我国传统工艺的瑰宝之一,如今在电脑技术的辅助下,玉雕电脑雕刻成为了一门精细而高效的艺术形式。本文将以连做教程为主题,介绍玉雕连做到电脑雕刻的关键步骤与技巧,帮助读者掌握这一...2025-11-04
 
二级不死域名是什么?所谓的二级不死域名,就是说一级域名juming.com 被封了,网页已停止访问了,但是它的任意二级子域名都还正常访问,aaa.juming.com ; xxx.juming.com2025-11-04
有关注册域名实名的问题,刚接触的朋友对实名域名不是很了解。那么实名域名是什么意思呢?域名要实名认证吗?有不需要实名认证的域名存在吗?以下是上述问题解答1、实名域名是什么意思?实名域名以实名制信息为基础2025-11-04
我的第一个 Go 工程需要处理一堆 JSON 测试固件并把 JSON 数据作为参数传给我们搭建的 API 处理。另一个团队为了给 API 提供语言无关的、可预期的输入和输出,创建了这些测试固件。在强类2025-11-04电脑经常出现10061错误的原因及解决方法(深入探讨10061错误,帮助您解决电脑连接问题)
摘要:随着计算机技术的发展,电脑已成为我们生活和工作中必不可少的一部分。然而,在使用电脑过程中,我们有时会遇到各种问题,其中之一就是10061错误。本文将围绕这一主题,详细介绍10061...2025-11-04
蚂蚁集团成立数据库独立公司OceanBase,年内将发布重大版本升级
蚂蚁集团6月8日宣布,将自研数据库产品OceanBase独立进行公司化运作,成立由蚂蚁100%控股的数据库公司北京奥星贝斯科技,并由蚂蚁集团CEO胡晓明亲自担任董事长。此举标志着蚂蚁旗下这一明星科技产2025-11-04

最新评论