0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Lombok如何派上用场

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-08 15:39 次阅读

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 受到限制的场景。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6792

    浏览量

    88725
  • JAVA
    +关注

    关注

    19

    文章

    2952

    浏览量

    104458
  • 代码
    +关注

    关注

    30

    文章

    4717

    浏览量

    68199
收藏 人收藏

    评论

    相关推荐

    太子献宝

    `为期两个月的“奔跑吧2016,资源跨年季”,抽中的工具箱奖品今天收到了,上午收到奖品下午就提着工具箱出门干活了,正好派上用场,工具箱看起来小巧金龙,挺适合外出维修带上,感觉这个工具箱非常不错`
    发表于 02-15 21:34

    TEA加密解密分享!

    不知道大家玩儿过没,我感觉涉及到安全问题的时候,会派上用场。算法原理没去研究,现在只知道怎么用,还没用在单片机上,仅仅是在vc下模拟过。算法是移植的,模拟的代码是自己写的。代码里面有注释,帮助大家使用。vc模拟TEA加密解密.zip (209.98 KB )
    发表于 10-15 04:37

    如何降低编程的难度

    平时学习,无论哪行的知识都要看一遍。学多学少都没关系。 比如我自己,连财会也看过,尽管我是学理科的。没想到竟然能派上用场。 语文数学是万物的基础知识,要永远保持在80分以上,点高点低都看这个。
    发表于 06-08 18:18

    IMS马达&软件&控制器及培训资料.part1

    工厂内部的一些资料,资料有点老,不知道能不能派上用场
    发表于 03-15 14:51 3次下载

    IMS马达&软件&控制器及培训资料.part2

    工厂内部的一些资料,资料有点老,不知道能不能派上用场
    发表于 03-15 14:50 3次下载

    IMS马达&软件&控制器及培训资料.part3

    工厂内部的一些资料,资料有点老,不知道能不能派上用场
    发表于 03-15 14:50 1次下载

    九寨沟地区发生7.0级地震,生命探测仪靠什么原理帮助寻人?

    突发事件寻人服务是寻人的延伸。最初开发时,我们希望它最好不要派上用场,但如果需要,它能第一时间发挥作用。 你们的平安,是今日的头条。
    发表于 08-09 08:56 4257次阅读

    工业物联网的发展得到了哪些技术的辅助

    网络系统是未来智能工厂的基础,但成败取决于数据收集、处理和分析能力,这就是机器视觉派上用场的时候了。
    发表于 09-23 08:58 592次阅读

    物联网在教育行业可以如何派上用场

    通过将物联网集成到教室中,教师可以使用语音或手势命令远程管理教室,与远程位置的学生建立通信,收集学生对特定主题的宝贵反馈,并为特殊学生提供帮助。
    发表于 04-26 14:43 1313次阅读

    3D打印技术或将在海上风力发电机建设中派上用场

    南极熊导读:海上风力发电机的叶片制造、基座建设,3D打印技术或将可以派上用场。 GE Renewables的Haliade-X风力发电涡轮机的叶片直径超过两个足球场,已经是世界上尺寸最大、功率最大
    的头像 发表于 01-04 09:41 2015次阅读

    Lombok开发插件使用小技巧

    0x01:Lombok简介 Lombok 是一款 Java开发插件,使得 Java 开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的 Java 模型对象(POJO)。在
    的头像 发表于 06-12 18:07 1737次阅读

    重演自己如何掉入Lombok的戏法陷阱

      https://www.ramostear.com/blog/2020/04/28/uk1860p8.html   如果您正在阅读此文,想必您对Project Lombok已经有了一段时间的了解
    的头像 发表于 10-28 11:29 1171次阅读

    Lombok同时使用@Data和@Builder的一个必须要避开的巨坑

    问题背景 Lombok @Data和@Builder分别单独分析用法 解决方法 方法一 方法二 Lombok原理 总结 问题背景 Lombok使⽤ 同时使⽤@Data和@Builder ,构建无参
    的头像 发表于 10-11 18:14 1916次阅读

    在LTspice仿真软件中如何使用FFT进行频谱分析

    在瞬态分析中,可以像示波器一样确认时间变化中的信号电平。而如果想确认信号中的频率,FFT 功能将派上用场,通过仿真模拟可以确认电路的失真和噪声成分。
    的头像 发表于 02-06 13:45 8766次阅读

    Lombok的使用

    在平时我们工作的时候,我们经常会使用 toString() 方法来输出一个对象的一些属性信息。Lombok 给我们提供了一个自动生成 toString() 代码的注解,可以减少代码行数,如果代码属性
    的头像 发表于 09-25 14:03 737次阅读