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

给正在使用Lombok的朋友一些建议

来源: 责编: 时间:2023-11-10 09:14:43 184观看
导读背景随之Java 21正式发布。该版本是继JDK 17之后最新的长期支持版本(LTS),将获得至少8年的支持!而SpringBoot3和Spring6的最低依赖就是JDK17了。在JAVA8的时代,开发者肯定都使用过Lombok库,这个库大大提升了我们的开发效率,

RH228资讯网——每日最新资讯28at.com

背景

随之Java 21正式发布。该版本是继JDK 17之后最新的长期支持版本(LTS),将获得至少8年的支持!而SpringBoot3和Spring6的最低依赖就是JDK17了。RH228资讯网——每日最新资讯28at.com

在JAVA8的时代,开发者肯定都使用过Lombok库,这个库大大提升了我们的开发效率,少写了很多代码,但是它也存在很多问题,下面我来细细聊一下。RH228资讯网——每日最新资讯28at.com

首先我们看下传统意义上的定义一个类:RH228资讯网——每日最新资讯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后的代码:RH228资讯网——每日最新资讯28at.com

import lombok.Data;@Datapublic class User {    private String userName;    private String email;    private int userId;}

@Data注解会自动生成所有的getter函数、字段的所有setter函数、toString函数、构造函数、hashCode和equals函数。RH228资讯网——每日最新资讯28at.com

@Data 注释结合了其他几个 Lombok 注释,例如 @Getter、@Setter、@EqualsAndHashCode 和 @toString。如果需要,我们还可以单独使用这些注释。RH228资讯网——每日最新资讯28at.com

看上去是很美好,不是吗?但是仔细思考下,会发现这些问题:RH228资讯网——每日最新资讯28at.com

  • 第三方依赖:Lombok是一个第三方库,作为开发人员,我们依赖第三方库来完成这些琐碎的事情。Lombok仅依靠社区支持来维护。如果随着Java 版本的升级可能会存在不兼容性问题或者该库不受支持,则会导致代码库出现问题。
  • IDE 兼容性: Lombok 依赖于编译时的代码生成,这可能并不总是与所有集成开发环境 (IDE) 无缝协作。某些 IDE 可能不完全支持 Lombok 功能,从而导致难以识别和理解生成的代码。

那么有什么好的替代方案吗?Record了解一下?RH228资讯网——每日最新资讯28at.com

什么是Record?RH228资讯网——每日最新资讯28at.com

Record是 Java 中从 Java 14(作为预览功能)开始引入的新功能,并在Java 16中正式引入。Records提供了一种简洁的方法来定义主要用于封装数据的简单类。它们是一种类,可以根据类的字段自动生成常用方法,例如构造函数、 equals()、hashCode()和。toString()RH228资讯网——每日最新资讯28at.com

你看到 Record 和 Lombok 之间的相似之处了吗?他们都在帮助我们实现同样的目标。RH228资讯网——每日最新资讯28at.com

那么如何使用呢?RH228资讯网——每日最新资讯28at.com

要使用 Record 定义上述 User 类,我们只需要这样做。RH228资讯网——每日最新资讯28at.com

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

就是这样。只需一行代码即可实现我们用 65 行传统编码和 5 行 Lombok 所做的事情。另外,我们不必依赖第三方库。RH228资讯网——每日最新资讯28at.com

一旦我们创建了上面的类,除了toString、hashCode和equals等类级别的方法之外,Java内部还定义了三个final变量及其getter方法。RH228资讯网——每日最新资讯28at.com

让我们详细讨论Record

一旦我们有了用户Record类,我们就可以开始使用它了。RH228资讯网——每日最新资讯28at.com

// Initialize the record.UserRecord userRecord = new UserRecord("test", "test@163.com", 1234);// get the propertiesSystem.out.println(userRecord.email());System.out.println(userRecord.toString());

请注意,getter 方法中没有“get”关键字。我们需要直接使用变量名作为方法名。例如,getEmail()我们不是像传统上那样使用,而是在调用 Record 方法时使用email()。RH228资讯网——每日最新资讯28at.com

一旦初始化,我们就无法设置 Record 的属性值。所有变量都是最终的。这意味着记录是不可变的RH228资讯网——每日最新资讯28at.com

我们可以在记录中定义实例和类函数。我们可以定义静态变量。我们不能定义实例变量。RH228资讯网——每日最新资讯28at.com

// 类(静态)变量  public static final String invalidEmailMessage = "INVALID EMAIL";  // 实例变量 - 不允许。会抛出错误。  public String defaultEmail = "xxxxx@163.com";  // 类函数  public static void sayMyName() {    System.out.println("zhangsan");  }  // 实例函数  public String emailDomain() {    return this.email.split("@")[1];  }
// 使用对象userRecord.emailDomain();// 使用 Class 调用静态方法。UserRecord.sayMyName();

Record类无法扩展。所有 Record 类都隐式扩展 Record 类。而且Java不允许多重继承。因此我们的 Record 类不能是任何其他类的子类。RH228资讯网——每日最新资讯28at.com

默认情况下,记录也是最终记录。因此我们不能将它们用作任何其他类的父类。RH228资讯网——每日最新资讯28at.com

记录构造器

该记录声明了一个带有所有参数的默认构造函数。这种类型的构造函数称为规范构造函数。RH228资讯网——每日最新资讯28at.com

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

我们可以在构造函数中编写自定义逻辑。RH228资讯网——每日最新资讯28at.com

public UserRecord(String username, String email, int userId) {    this.username = username;    this.email = email;    this.userId = userId;    if (userId < 1) {      throw new IllegalArgumentException("UserId can not be less than 1");    }  }

有一个很棒的功能,我们可以通过消除不必要的细节来创建一个紧凑的构造函数。例如,上面具有自定义逻辑的规范构造函数可以以紧凑的形式重写为:RH228资讯网——每日最新资讯28at.com

public UserRecord {    if (userId < 1) {      throw new IllegalArgumentException("UserId can not be less than 1");    }  }

比较Lombok和Record:

功能RH228资讯网——每日最新资讯28at.com

LombokRH228资讯网——每日最新资讯28at.com

RecordRH228资讯网——每日最新资讯28at.com

不变性RH228资讯网——每日最新资讯28at.com

没有RH228资讯网——每日最新资讯28at.com

是的RH228资讯网——每日最新资讯28at.com

可扩展性RH228资讯网——每日最新资讯28at.com

是的RH228资讯网——每日最新资讯28at.com

没有RH228资讯网——每日最新资讯28at.com

样板代码RH228资讯网——每日最新资讯28at.com

减少RH228资讯网——每日最新资讯28at.com

减少RH228资讯网——每日最新资讯28at.com

可读性RH228资讯网——每日最新资讯28at.com

可能会更难阅读RH228资讯网——每日最新资讯28at.com

更容易阅读RH228资讯网——每日最新资讯28at.com

稳健性RH228资讯网——每日最新资讯28at.com

不太稳健RH228资讯网——每日最新资讯28at.com

更坚固RH228资讯网——每日最新资讯28at.com

第三方依赖RH228资讯网——每日最新资讯28at.com

是的RH228资讯网——每日最新资讯28at.com

没有RH228资讯网——每日最新资讯28at.com

IDE 兼容性RH228资讯网——每日最新资讯28at.com

不容易RH228资讯网——每日最新资讯28at.com

简单RH228资讯网——每日最新资讯28at.com

有性能差异吗?

不会。就性能而言,使用Java记录和Lombok注释没有显著差异。两者生成的代码一旦编译,在性能特征方面与手写代码没有什么不同。生成的代码由 Java 编译器优化,因此几乎没有性能开销。RH228资讯网——每日最新资讯28at.com

结论:

本文表明我们应该使用记录来编写更清晰、更具可读性的代码。记录可以帮助我们减少样板代码,而无需任何第三方库。Lombok 与 IDE 存在一些兼容性问题。RH228资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-19894-0.html给正在使用Lombok的朋友一些建议

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

上一篇: SpringBoot常用的50个注解,一目了然

下一篇: 面试官必问的分布式锁面试题,你答得上来吗?

标签:
  • 热门焦点
  • 小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    在今天下午的小米Civi 2新品发布会上,小米还带来了一款新的降噪蓝牙耳机Necklace,我们也在发布结束的第一时间给大家带来这款耳机的简单分享。现在大家能见到最多的蓝牙耳机
  • 石头自清洁扫拖机器人G10S评测:多年黑科技集大成之作 懒人终极福音

    石头自清洁扫拖机器人G10S评测:多年黑科技集大成之作 懒人终极福音

    科技圈经常能看到一个词叫“缝合怪”,用来形容那些把好多功能或者外观结合在一起的产品,通常这样的词是贬义词,但如果真的是产品缝合的好、缝合的实用的话,那它就成了中性词,今
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • 消息称迪士尼要拍真人版《魔发奇缘》:女主可能也找黑人演员

    消息称迪士尼要拍真人版《魔发奇缘》:女主可能也找黑人演员

    8月5日消息,迪士尼确实有点忙,忙着将不少动画改成真人版,继《美人鱼》后,真人版《白雪公主》、《魔发奇缘》也在路上了。据外媒消息称,迪士尼将打造真人版
  • K6:面向开发人员的现代负载测试工具

    K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • 如何正确使用:Has和:Nth-Last-Child

    如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • WebRTC.Net库开发进阶,教你实现屏幕共享和多路复用!

    WebRTC.Net库开发进阶,教你实现屏幕共享和多路复用!

    WebRTC.Net库:让你的应用更亲民友好,实现视频通话无痛接入! 除了基本用法外,还有一些进阶用法可以更好地利用该库。自定义 STUN/TURN 服务器配置WebRTC.Net 默认使用 Google 的
  • 阿里大调整

    阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • 微博大门常打开,迎接海外画师漂洋东渡

    微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
Top