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

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

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

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

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

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

Lombok的威力

Lombok是我一直都喜欢使用的工具,因为它可以让我们的代码变的更加整洁。比如:当我们要写一个User对象的时候,如果不使用Lombok,往往需要写这么多内容:C4K28资讯网——每日最新资讯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注解,可以将以上内容缩减到只需要下面这几行即可:C4K28资讯网——每日最新资讯28at.com

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

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

Lombok的问题

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

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

使用record来替代

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

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

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

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

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

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

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

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

哪些情况替代不了?

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

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

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

总结

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

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

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

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

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

标签:
  • 热门焦点
  • 《英雄联盟》夏季赛总决赛今日开打!JDG对阵LNG首发名单来了 Knight:准备三连冠

    8月5日消息,今日17:00,《英雄联盟》2023LPL夏季赛总决赛将正式开打,由JDG对阵LNG。对两支队伍来说,这场比赛不仅要争夺夏季赛冠军,更要决定谁才是LPL赛区一
  • 企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
  • 腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    作者:无锈钵来源:财经无忌7月16日晚,上海1862时尚艺术中心。伴随着幻象的精准命中,硕大的荧幕之上,比分被定格在了14:12,被寄予厚望的EDG战队以绝对的优势战胜了BLG战队,拿下了总决
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事“起猛了,我能看得懂日语了”。“为什么日本人说话我能听懂?”“中文不像中文,日语不像日语,但是我竟然看懂了”…&hell
  • 联想的ThinkBook Plus下一版曝光,键盘旁边塞个平板

    ThinkBook Plus 是联想的一个特殊笔记本类别,它在封面放入了一块墨水屏,也给人留下了较为深刻的印象。据有人爆料,联想的下一款 ThinkBook Plus 可能更特殊,它
  • 上海举办人工智能大会活动,建设人工智能新高地

    人工智能大会在上海浦江两岸隆重拉开帷幕,人工智能新技术、新产品、新应用、新理念集中亮相。8月30日晚,作为大会的特色活动之一的上海人工智能发展盛典人工
Top