一文了解Java中record和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
的数据模型。
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 受到限制的场景。
以上就是一文了解Java中record和lombok的使用对比的详细内容,更多关于Java record lombok的资料请关注脚本之家其它相关文章!
相关文章
SparkSQL使用IDEA快速入门DataFrame与DataSet的完美教程
本文给大家介绍使用idea开发Spark SQL 的详细过程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧2021-08-08Apache Commons Imaging处理图像实例深究
这篇文章主要为大家介绍了Apache Commons Imaging处理图像的实例探索深究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-12-12剑指Offer之Java算法习题精讲数组与列表的查找及字符串转换
跟着思路走,之后从简单题入手,反复去看,做过之后可能会忘记,之后再做一次,记不住就反复做,反复寻求思路和规律,慢慢积累就会发现质的变化2022-03-03Java实用技巧:如何使用String去除开头的第一个字符?
这篇文章主要介绍了Java实用技巧:如何使用String去除开头的第一个字符,需要的朋友可以参考下2023-11-11idea2019.2安裝MybatisCodeHelper插件的超详细教程
这篇文章主要介绍了idea2019.2安裝MybatisCodeHelper插件的教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-09-09SpringBoot使用maven实现多环境运行和打包的操作步骤
在开发过程中,需要不断进行环境的切换和打包部署,maven提供了多环境配置,可以方便实现不同环境的配置切换和打包,本文通过代码示例给大家介绍的非常详细,需要的朋友可以参考下2024-04-04
最新评论