您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

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

时间:2023-10-21 14:27:26  来源:今日头条  作者:知识创富老七

背景

随之JAVA 21正式发布。该版本是继JDK 17之后最新的长期支持版本(LTS),将获得至少8年的支持!而SpringBoot3和Spring6的最低依赖就是JDK17了。

在JAVA8的时代,开发者肯定都使用过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后的代码:

import lombok.Data;

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

@Data注解会自动生成所有的getter函数、字段的所有setter函数、toString函数、构造函数、hashCode和equals函数。

@Data 注释结合了其他几个 Lombok 注释,例如 @Getter、@Setter、@EqualsAndHashCode 和 @toString。如果需要,我们还可以单独使用这些注释。

看上去是很美好,不是吗?但是仔细思考下,会发现这些问题:

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

那么有什么好的替代方案吗?Record了解一下?

什么是Record

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

你看到 Record 和 Lombok 之间的相似之处了吗?他们都在帮助我们实现同样的目标。

那么如何使用呢?

要使用 Record 定义上述 User 类,我们只需要这样做。

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

就是这样。只需一行代码即可实现我们用 65 行传统编码和 5 行 Lombok 所做的事情。另外,我们不必依赖第三方库。

一旦我们创建了上面的类,除了toString、hashCode和equals等类级别的方法之外,Java内部还定义了三个final变量及其getter方法。

让我们详细讨论Record

一旦我们有了用户Record类,我们就可以开始使用它了。

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

请注意,getter 方法中没有“get”关键字。我们需要直接使用变量名作为方法名。例如,getEmail()我们不是像传统上那样使用,而是在调用 Record 方法时使用email()。

一旦初始化,我们就无法设置 Record 的属性值。所有变量都是最终的。这意味着记录是不可变的

我们可以在记录中定义实例和类函数。我们可以定义静态变量。我们不能定义实例变量。

   // 类(静态)变量
  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 类不能是任何其他类的子类。

默认情况下,记录也是最终记录。因此我们不能将它们用作任何其他类的父类。

记录构造器

该记录声明了一个带有所有参数的默认构造函数。这种类型的构造函数称为规范构造函数

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

我们可以在构造函数中编写自定义逻辑。

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");
    }
  }

有一个很棒的功能,我们可以通过消除不必要的细节来创建一个紧凑的构造函数。例如,上面具有自定义逻辑的规范构造函数可以以紧凑的形式重写为:

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

比较Lombok和Record:

功能

Lombok

Record

不变性

没有

是的

可扩展性

是的

没有

样板代码

减少

减少

可读性

可能会更难阅读

更容易阅读

稳健性

不太稳健

更坚固

第三方依赖

是的

没有

IDE 兼容性

不容易

简单

有性能差异吗?

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

结论:

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



Tags:Lombok   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
给正在使用Lombok的朋友一些建议
背景随之Java 21正式发布。该版本是继JDK 17之后最新的长期支持版本(LTS),将获得至少8年的支持!而SpringBoot3和Spring6的最低依赖就是JDK17了。在JAVA8的时代,开发者肯定都使用...【详细内容】
2023-10-21  Search: Lombok  点击:(227)  评论:(0)  加入收藏
Redis和Lombok的下载安装
下载地址:下载界面:下载好之后进行安装安装界面下一步安装路径的改动默认下一步继续下一步安装点击完成这是我们的安装目录最简单的启动方式是直接双击redis-server.exe如果要...【详细内容】
2022-10-10  Search: Lombok  点击:(339)  评论:(0)  加入收藏
面试官:你天天用 Lombok,说说它什么原理?
背景相信大家在项目中都使用过Lombok,因为能够简化我们许多的代码,但是该有的功能一点也不少。那么lombok到底是个什么呢,lombok是一个可以通过简单的注解的形式来帮助我们简化...【详细内容】
2022-05-07  Search: Lombok  点击:(578)  评论:(0)  加入收藏
Lombok入门使用教程及其优缺点详解
在Java开发中,因工作需要,你可能会学习或被迫去学习Lombok这个工具,这玩意用起来可以说是贼爽,很方便,可玄武老师实际上并不推荐大家使用,至于Lombok是什么?怎么入门?为什么不推荐使...【详细内容】
2020-10-23  Search: Lombok  点击:(284)  评论:(0)  加入收藏
为什么有些公司不让用Lombok?
去年在项目当中引入了Lombok插件,着实解放了双手,代替了一些重复的简单工作(Getter,Setter,toString等方法的编写),但是,在使用的过程当中,也发现了一些坑,开始的时候并没有察觉到...【详细内容】
2020-10-21  Search: Lombok  点击:(368)  评论:(0)  加入收藏
让人又爱又恨的Lombok,到底该不该用
1 简介Lombok,印尼的一个岛屿,龙目岛。但在Java的世界里,它是一个方便的类库,能提供很多便利,因此得到许多人的青睐。但也有不少反对声音。这是为什么呢? 之前去龙目岛拍的日落。2...【详细内容】
2020-06-17  Search: Lombok  点击:(467)  评论:(0)  加入收藏
一文读懂Lombok原理
相信大家在项目中都使用过Lombok,因为能够简化我们许多的代码,但是该有的功能一点也不少。那么lombok到底是个什么呢,lombok是一个可以通过简单的注解的形式来帮助我们简化消除...【详细内容】
2020-03-08  Search: Lombok  点击:(307)  评论:(0)  加入收藏
最全 Lombok介绍、使用方法和总结
1 Lombok背景介绍官方介绍如下:Project Lombok makes java a spicier language by adding &#39;handlers&#39; that know how to build and compile simple, boilerplate-fre...【详细内容】
2019-12-06  Search: Lombok  点击:(421)  评论:(0)  加入收藏
▌简易百科推荐
Java 8 内存管理原理解析及内存故障排查实践
本文介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置,以及各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断,方便读者面临内存故障时...【详细内容】
2024-03-20  vivo互联网技术    Tags:Java 8   点击:(14)  评论:(0)  加入收藏
如何编写高性能的Java代码
作者 | 波哥审校 | 重楼在当今软件开发领域,编写高性能的Java代码是至关重要的。Java作为一种流行的编程语言,拥有强大的生态系统和丰富的工具链,但是要写出性能优异的Java代码...【详细内容】
2024-03-20    51CTO  Tags:Java代码   点击:(19)  评论:(0)  加入收藏
在Java应用程序中释放峰值性能:配置文件引导优化(PGO)概述
译者 | 李睿审校 | 重楼在Java开发领域,优化应用程序的性能是开发人员的持续追求。配置文件引导优化(Profile-Guided Optimization,PGO)是一种功能强大的技术,能够显著地提高Ja...【详细内容】
2024-03-18    51CTO  Tags:Java   点击:(24)  评论:(0)  加入收藏
Java生产环境下性能监控与调优详解
堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,...【详细内容】
2024-02-04  大雷家吃饭    Tags:Java   点击:(55)  评论:(0)  加入收藏
在项目中如何避免和解决Java内存泄漏问题
在Java中,内存泄漏通常指的是程序中存在一些不再使用的对象或数据结构仍然保持对内存的引用,从而导致这些对象无法被垃圾回收器回收,最终导致内存占用不断增加,进而影响程序的性...【详细内容】
2024-02-01  编程技术汇  今日头条  Tags:Java   点击:(68)  评论:(0)  加入收藏
Java中的缓存技术及其使用场景
Java中的缓存技术是一种优化手段,用于提高应用程序的性能和响应速度。缓存技术通过将计算结果或者经常访问的数据存储在快速访问的存储介质中,以便下次需要时可以更快地获取。...【详细内容】
2024-01-30  编程技术汇    Tags:Java   点击:(72)  评论:(0)  加入收藏
JDK17 与 JDK11 特性差异浅谈
从 JDK11 到 JDK17 ,Java 的发展经历了一系列重要的里程碑。其中最重要的是 JDK17 的发布,这是一个长期支持(LTS)版本,它将获得长期的更新和支持,有助于保持程序的稳定性和可靠性...【详细内容】
2024-01-26  政采云技术  51CTO  Tags:JDK17   点击:(88)  评论:(0)  加入收藏
Java并发编程高阶技术
随着计算机硬件的发展,多核处理器的普及和内存容量的增加,利用多线程实现异步并发成为提升程序性能的重要途径。在Java中,多线程的使用能够更好地发挥硬件资源,提高程序的响应...【详细内容】
2024-01-19  大雷家吃饭    Tags:Java   点击:(105)  评论:(0)  加入收藏
这篇文章彻底让你了解Java与RPA
前段时间更新系统的时候,发现多了一个名为Power Automate的应用,打开了解后发现是一个自动化应用,根据其描述,可以自动执行所有日常任务,说的还是比较夸张,简单用了下,对于office、...【详细内容】
2024-01-17  Java技术指北  微信公众号  Tags:Java   点击:(95)  评论:(0)  加入收藏
Java 在 2023 年仍然流行的 25 个原因
译者 | 刘汪洋审校 | 重楼学习 Java 的过程中,我意识到在 90 年代末 OOP 正值鼎盛时期,Java 作为能够真正实现这些概念的语言显得尤为突出(尽管我此前学过 C++,但相比 Java 影响...【详细内容】
2024-01-10  刘汪洋  51CTO  Tags:Java   点击:(74)  评论:(0)  加入收藏
站内最新
站内热门
站内头条