使用Java 17中的record替代Lombok的部分功能

这篇具有很好参考价值的文章主要介绍了使用Java 17中的record替代Lombok的部分功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在DD长期更新的Java新特性专栏中,已经介绍过Java 16中开始支持的新特性:record的使用。

之前只是做了介绍,但没有结合之前的编码习惯或规范来聊聊未来的应用变化。最近正好因为互相review一些合作伙伴的代码,产生了一些讨论话题,主要正针对于有了record之后,其实之前有些用Lombok的场景,是可以替换掉了。

今天我们就来小小的总结下,我们可以在哪些地方,利用record来替换Lombok

Lombok的威力

Lombok是我一直都喜欢使用的工具,因为它可以让我们的代码变的更加整洁。比如:当我们要写一个User对象的时候,如果不使用Lombok,往往需要写这么多内容:

public class User {
    private String username;
    private String email;
    private int userId;

    public User(String username, String email, int userId) {
        this.username = username;
        this.email = email;
        this.userId = userId;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        User user = (User) o;

        if (userId != user.userId) return false;
        if (username != null ? !username.equals(user.username) : user.username != null) return false;
        return email != null ? email.equals(user.email) : user.email == null;
    }

    @Override
    public int hashCode() {
        int result = username != null ? username.hashCode() : 0;
        result = 31 * result + (email != null ? email.hashCode() : 0);
        result = 31 * result + userId;
        return result;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", email='" + email + '\'' +
                ", userId=" + userId +
                '}';
    }
}

在有了Lombok之后呢,通过使用@Data注解,可以将以上内容缩减到只需要下面这几行即可:

@Data
public class User {
    private String username;
    private String email;
    private int userId;
}

@Data注解涵盖了@Getter@Setter@EqualsAndHashCode@toString,所以一个注解就可以实现成员变量的Getter和Setter,equals和hashcode方法的重写,以及toString的重写。大大降低了代码量,让代码看上去更加整洁。

Lombok的问题

虽然Lombok可以帮助我们少些很多代码,但它依然有一些缺点,比如:

  1. Lombok并非Java官方提供,而是第三方依赖,依靠社区维护。对于较新的Java版本通常都会存在兼容性问题,容易产生一些不可预知的奇怪错误。
  2. IDE的兼容限制,并不是所有的IDE都可以完美兼容Lombok,所以可能也会因此产生一些奇怪的错误。

使用record来替代

在之前的Java 新特性:record一文中,已经提到过record类可以根据类的字段自动生成:构造函数、equals()、hashCode() 和 toString()。这个功能就跟上面我们演示的Lombok中的@Data非常类似。

写法的话也非常简单,只需要这样一行即可搞定:

public record UserRecord(String username, String email, int userId) {}

可以看到该代码的整洁度比Lombok的实现更加干净。同时,最关键的一点,这是Java原生支持的,不需要引入任何第三方依赖!

record类定义完成了,具体使用的话就跟平时使用其他类一样,去创建实例和调用方法即可,比如下面这样:

UserRecord userRecord = new UserRecord("didi", "didi@didispace.com", 35);
System.out.println(userRecord.email());
System.out.println(userRecord.toString());

只是,我们在使用的时候需要了解record自动生成的代码与Lombok的区别,就能马上上手。

比如,从上面的例子中我们可以看到一个区别:获取成员变量email的时候,这里并不想传统getter那样以getEmail()的形式生成。

哪些情况替代不了?

record类已经很强大,但目前并不能完全替代Lombok。主要原因如下:

  1. record中定义的成员变量是final类型的,初始化后就不能修改了
  2. record类不能被继承,所以也无法进一步扩展

因此,在用record替代Lombok的时候,更多用来定义静态变量,而不是可能会变化的实例变量。但是,由于record中也可以定义函数,所以对于一些对成员计算获得的内容,也可以实现和使用。

总结

Lombokrecord都可以帮助我们编写更加整洁的代码。前者是第三方库,可能存在一些不可预知的问题和IDE兼容问题,但功能更加全面和强大;后者属于Java原生的能力,功能虽弱一些,但用好它也能帮助我们减少很多代码的编写,且IDE兼容性更好。

好了,今天的分享就到这里。如果您学习过程中如遇困难?可以加入我们超高质量的技术交流群,参与交流与讨论,更好的学习与进步!更多Java新特性教程可以点击直达!,欢迎收藏与转发支持!

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源文章来源地址https://www.toymoban.com/news/detail-781725.html

到了这里,关于使用Java 17中的record替代Lombok的部分功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java使用Lombok详解

    Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注释实现这一目的。通过在开发环境中实现 Lombok,开发人员可以节省构建诸如 hashCode() 和 equals() 、 getter / setter 这样的方法以及以往用来分类各种 accessor 和 mutator

    2023年04月08日
    浏览(37)
  • 问,由于java存在性能上,以及部分功能上的缺点,请问如何正确使用C,C++,Go,这三个语言,提升Java Web项目的性能?

    拓展阅读:版本任你发,我用java8 我明白Java虽然在许多方面表现出色,但在某些特定场景下可能会遇到性能瓶颈或功能限制。为了提升Java Web项目的性能,可以考虑将C、C++和Go这三种语言用于特定的组件或服务。以下是如何正确使用这些语言来提升性能的一些建议: 1. **性能

    2024年04月23日
    浏览(37)
  • 【JDK版本差异】Optional.requireNonNullElseGet在JAVA8中的替代表述

    Objects.requireNonNullElseGet 是 Java 9 引入的方法,不在 Java 8 中可用。但是, 可以使用 Java 8 的一些功能来模拟类似的效果。 JDK9以上表述: JDK8中的表述: 在Java9中,该方法本质上就是在 obj 为空的时候,接收一个 Supplier 参数,生成一个默认值。 在 Java 8 中,可以使用 Optional 类的

    2024年02月12日
    浏览(61)
  • IDEA 解决 java: 找不到符号 符号: 类 __ (使用了lombok的注解)

    原因IDEA版本太高,在 ProcessingEnvironement 预编译的时候是以代理的方式来执行的,不再是直接 javac方式,  lombok依赖的 javac方式的 annotation processors 不再生效了 解决办法:下面这一句,加在下图中 -Djps.track.ap.dependencies=false 收工

    2024年04月10日
    浏览(49)
  • 详解 Vue 3 使用了 Proxy 对象来替代 Vue 2 中的 Object.defineProperty

    在 Vue 2 中,响应式系统使用了 Object.defineProperty 来实现属性的劫持和监听。这种方式需要在对象上定义 getter 和 setter,以便在属性被访问或修改时触发相应的操作。 然而,Object.defineProperty 有一些限制和性能问题。它只能劫持对象的已有属性,无法劫持新增的属性,也无法劫

    2024年02月10日
    浏览(44)
  • Java---使用lombok简化实体类的编写----不要再写getter+sertter方法了

    目录 使用lombok简化实体类的编写 首先: 加入lombok依赖: 然后 加上一个注解:@Data    删除原来实体类中的方法 加上一个注解:@Data    注意:@Data(包含了:@Setter @Getter @ToString @EqualsAndHashCode)但是 不包含构造方法的注解可以手动加上: @NoArgsConstructor @AllArgsConstructor

    2024年02月14日
    浏览(43)
  • java 使用 jtransforms 傅里叶变换库实现删除 wav 歌曲中的人声、提取歌曲旋律功能

    引入 maven 依赖: 原理: 将音频信号进行分帧处理,将每一帧的数据进行傅里叶变换,得到短时傅里叶变换(STFT)。 对于每一帧的频谱,可以通过观察频谱图的特征来确定人声和旋律所在的频率范围。 根据人声和旋律所在的频率范围,可以将频谱图中对应的频率区域置零,

    2024年01月23日
    浏览(43)
  • Java中的各种引用类型以及部分引用的相关例子

    在Java中,引用类型主要有四种,分别是:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。这些类型通常与垃圾回收机制有关,用来描述对象的生命周期和可达性。下面详细介绍每一种引用类型: 强引用 (Strong Reference) 强

    2024年04月13日
    浏览(42)
  • 华为路由器组网部分功能无法使用的解决办法

    遇到路由器组网部分功能无法使用怎么办?其实使用路由器组网后会遇到网络中各种功能无法实现的问题,其实这大多是由于路由器的设置问题造成的,yii666的小编带大家一起看看以华为路由器为实例的解决办法。 一、组网环境 1、在华为路由的组网环境中,华为A和华为B为

    2024年02月07日
    浏览(108)
  • 项目(智慧教室)第四部分,页面交互功能,WebServer建立与使用,

    一。页面构思 1.标题栏         大标题:智慧教室管理系统         小标题:灯光,报警,风扇,温度,湿度,光照 2.样式设计         背景设置。字体设置(字体大小,格式,颜色) 3.导航栏         6个导航栏标签:3个传感器,3个控制         每次点击

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包