当前位置:首页 > 科技  > 软件

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

来源: 责编: 时间:2024-01-15 09:21:47 260观看
导读在DD长期更新的Java新特性专栏中,已经介绍过Java 16中开始支持的新特性:record的使用:2分钟学会Java中record关键字的用法之前只是做了介绍,但没有结合之前的编码习惯或规范来聊聊未来的应用变化。最近正好因为互相review

在DD长期更新的Java新特性专栏中,已经介绍过Java 16中开始支持的新特性:record的使用:2分钟学会Java中record关键字的用法HuL28资讯网——每日最新资讯28at.com

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

今天我们就来小小的总结下,我们可以在哪些地方,利用record来替换Lombok。HuL28资讯网——每日最新资讯28at.com

Lombok的威力

Lombok是我一直都喜欢使用的工具,因为它可以让我们的代码变的更加整洁。比如:当我们要写一个User对象的时候,如果不使用Lombok,往往需要写这么多内容:HuL28资讯网——每日最新资讯28at.com

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注解,可以将以上内容缩减到只需要下面这几行即可:HuL28资讯网——每日最新资讯28at.com

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

@Data注解涵盖了@Getter、@Setter、@EqualsAndHashCode 和 @toString,所以一个注解就可以实现成员变量的Getter和Setter,equals和hashcode方法的重写,以及toString的重写。大大降低了代码量,让代码看上去更加整洁。HuL28资讯网——每日最新资讯28at.com

Lombok的问题

虽然Lombok可以帮助我们少些很多代码,但它依然有一些缺点,比如:HuL28资讯网——每日最新资讯28at.com

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

使用record来替代

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

写法的话也非常简单,只需要这样一行即可搞定:HuL28资讯网——每日最新资讯28at.com

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

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

record类定义完成了,具体使用的话就跟平时使用其他类一样,去创建实例和调用方法即可,比如下面这样:HuL28资讯网——每日最新资讯28at.com

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

只是,我们在使用的时候需要了解record自动生成的代码与Lombok的区别,就能马上上手。HuL28资讯网——每日最新资讯28at.com

比如,从上面的例子中我们可以看到一个区别:获取成员变量email的时候,这里并不想传统getter那样以getEmail()的形式生成。HuL28资讯网——每日最新资讯28at.com

哪些情况替代不了?

record类已经很强大,但目前并不能完全替代Lombok。主要原因如下:HuL28资讯网——每日最新资讯28at.com

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

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

总结

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

本文链接:http://www.28at.com/showinfo-26-60981-0.html使用Java 17中的 record 替代 Lombok 的部分功能

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 面试官:单例Bean一定不安全吗?实际工作中如何处理此问题?

下一篇: 汇聚软件测试领域最新实操经验,2024 Gtest峰会不能错过!

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • Automa-通过连接块来自动化你的浏览器

    1、前言通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。Selenium IDEKat
  • 多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • 造车两年股价跌六成,小米的估值逻辑变了吗?

    如果从小米官宣造车后的首个交易日起持有小米集团的股票,那么截至2023年上半年最后一个交易日,投资者将浮亏59.16%,同区间的恒生科技指数跌幅为52.78%
  • 苹果、三星、惠普等暂停向印度出口笔记本和平板电脑

    集微网消息,据彭博社报道,在8月3日印度突然禁止在没有许可证的情况下向印度进口电脑/平板及显示器等产品后,苹果、三星电子和惠普等大公司暂停向印度
  • iQOO 11S屏幕细节公布:首发三星2K E6全感屏 安卓最好的直屏手机

    日前iQOO手机官方宣布,新一代电竞旗舰iQOO 11S将会在7月4日19:00正式与大家见面。随着发布时间的日益临近,官方关于该机的预热也更加密集,截至目前已
Top