大家好,我是北军。Java的record关键字是Java14中引入的新语义特性。records对于创建小型不可变对象很有用。另一方面,Lombok是一个Java库,可以自动将一些已知模式生成为Java字节码。尽管两者都可用于减少样板代码,但它们是不同的工具。因此,我们应该在特定的情况下使用更适合我们需求的工具。在本文中,我们将探讨各种用例,包括Java记录的一些限制。对于每个示例,我们将了解Lombok如何派上用场并比较这两种解决方案。小型不可变对象我们的第一个示例将使用Color对象。一个Color由三个整数值组成,分别代表红、绿、蓝三个通道。此外,颜色公开其十六进制表示。例如,颜色RGB(255,0,0)将具有#FF0000的十六进制表示。此外,如果两种颜色具有相同的RGB值,我们希望它们相等。基于这些原因,本案中记录的选择是相当合理的。公共记录ColorRecord(intred,intgreen,intblue){publicStringgetHexString(){returnString.format("#%02X%02X%02X",red,green,blue);}}同样,Lombok允许我们使用@Value注解来创建不可变对象。@ValuepublicclassColorValueObject{int红色;诠释绿色;蓝色;publicStringgetHexString(){returnString.format("#%02X%02X%02X",red,green,blue);但是,从Java14开始,记录将成为这些用例的最常见方式。透明数据载体根据JDK增强提案(JEP395),record是一个充当不可变数据透明载体的类。例如,我们不能强制前面例子中的ColorRecord只暴露hexString而完全隐藏三个整型字段。然而,Lombok允许我们自定义getter的名称、访问级别和返回类型。让我们相应地更新ColorValueObject。@Value@Getter(AccessLevel.NONE)publicclassColorValueObject{intred;诠释绿色;蓝色;publicStringgetHexString(){returnString.format("#%02X%02X%02X",red,green,blue);}}所以如果我们需要不可变的数据对象,记录是一个很好的解决方案。但是,如果我们想隐藏成员字段,只暴露使用它们执行的一些操作,Lombok更适合。具有许多字段的类我们已经看到记录是如何非常方便地创建小的、不可变的对象的方法。让我们看看如果数据模型需要更多字段,记录会是什么样子。在此示例中,让我们考虑Student数据模型。publicrecordStudentRecord(Stringname,LongstudentId,Stringemail,StringphoneNumber,Stringaddress,Stringcountry,intage){}正如我们已经猜到的那样,StudentRecord的实例化将难以阅读和理解,特别是如果某些字段是不是强制性的。StudentRecordjohn=newStudentRecord("John",null,"xxxx@qq.com",null,null,"sh",20);为了方便这些使用,Lombok提供了[Builder设计模式](/creational-design-patterns#builder)实现。为了使用它,我们只需要用@Builder:注释我们的类。@Getter@Builder公共类StudentBuilder{私有字符串名称;私人长学生号;私人字符串电子邮件;私人字符串电话号码;私有字符串地址;私人字符串国家;privateintage;}现在,让我们使用StudentBuilder创建一个具有相同属性的对象。StudentBuilderjohn=StudentBuilder.builder().name("John").email("xxx@qq.com").country("sh").age(20).build();如果我们比较两者,我们会注意到使用构建器模式是有益的并且会导致更清晰的代码。总而言之,记录对于较小的对象更好。虽然,对于具有许多字段的对象,缺少创建模式会使Lombok的@Builder成为更好的选择。可变数据我们可以使用javarecord来专门处理不可变数据。如果上下文需要一个可变的java对象,我们可以使用Lombok的@Data对象来代替:@Data@AllArgsConstructorpublicclassColorData{privateintred;私人诠释绿色;私人诠释蓝色;publicStringgetHexString(){returnString.format("#%02X%02X%02X",red,green,blue);}}一些框架可能需要带有setter或默认构造函数的对象。例如,Hibernate就属于这一类。创建@Entity时,我们必须使用Lombok注释或纯Java。继承Java记录不支持继承。因此,它们不能从其他类扩展或继承。另一方面,Lombok的@Value对象可以扩展其他类,但它们是最终的。@ValuepublicclassMonochromeColorextendsColorData{publicMonochromeColor(intgrayScale){super(grayScale,grayScale,grayScale);此外,@Data对象可以扩展其他类或被扩展。总之,如果我们需要继承,我们应该坚持使用Lombok的解决方案。结束语在本文中,我们已经看到Lombok和java记录是具有不同用途的不同工具。另外,我们发现Lombok更加灵活,可以在记录受限的场景下使用。
