在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中也可以定义函数,所以对于一些对成员计算获得的内容,也可以实现和使用。

总结

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

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

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

使用Java 17中的record替代Lombok的部分功能的更多相关文章

  1. 详解 Java 17 中新推出的密封类

    Java 17推出的新特性Sealed Classes经历了2个Preview版本(JDK 15中的JEP 360.JDK 16中的JEP 397),最终定稿于JDK 17中的JEP 409.Seal ...

  2. Java 17 中的模式匹配与和类型

    Java 17 中的模式匹配与和类型 从 Spring Security 获取用户谈起 使用 Spring Security做用户校验和权限控制时,常常使用和线程绑定的容器来获取当前登录用户. // ...

  3. Java 17中对switch的模式匹配增强

    还记得Java 16中的instanceof增强 吗? 通过下面这个例子再回忆一下: Map<String, Object> data = new HashMap<>(); d ...

  4. Java 17 将要发布,补一下 Java 13 中的新功能

    本文章属于Java 新特性教程 系列,已经收录在 Github.com/niumoo/JavaNotes ,点个赞,不迷路. 自从 Oracle 调整了 Java 的版本发布节奏之后,Java 版本发 ...

  5. Java 17 新功能介绍(LTS)

    点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. Jav ...

  6. 我所使用的生产 Java 17 启动参数

    JVM 参数升级提示工具:jacoline.dev/inspect JVM 参数词典:chriswhocodes.com Revolut(英国支付巨头)升级 Java 17 实战:https://ww ...

  7. Java编程中“为了性能”尽量要做到的一些地方

    最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源总结的一些在Ja ...

  8. java编程中'为了性能'一些尽量做到的地方

    原文地址:http://blog.csdn.NET/m13666368773/article/details/7796924 最近的机器内存又爆满了,出了新增机器内存外,还应该好好review一下我们 ...

  9. Java开发中常用jar包整理及使用

    本文整理了我自己在Java开发中常用的jar包以及常用的API记录. <!-- https://mvnrepository.com/artifact/org.apache.commons/com ...

  10. Java 16 中新增的 Stream 接口的一些思考

    这里先提一个题外话,如果想看 JDK 不同版本之间有何差异,增加或者删除了哪些 API,可以通过下面这个链接查看: https://javaalmanac.io/jdk/17/apidiff/11/ ...

随机推荐

  1. [GKCTF 2020]cve版签到

    通过题目的提示可知,这是一个CVE(cve-2020-7066)的复现 点击进之后也无回显 看了这个cve之后,知道这个cve就是这个get_headers()会截断URL中空字符后的内容 就根据cv ...

  2. ES6入门(一)

    1.let声明的变量只在let命令所在的代码块内有效 2.不存在变量提升,先使用变量,后定义变量,就会报错. 3.let不允许在相同作用域内,重复声明同一个变量.

  3. Linux-管道、环境变量、常用命令

    目录 管道 概念 要点 与文件重定向的区别 环境变量 概念 查看 常用命令 查看系统状况 权限 文件查找 用户相关 工具 管道 概念 管道的作用类似于文件重定向,可以将前一个命令的stout做为下一个 ...

  4. HarmonyOS 高级特性

    引言 本章将探讨 HarmonyOS 的高级特性,包括分布式能力.安全机制和性能优化.这些特性可以帮助你构建更强大.更安全.更高效的应用. 目录 HarmonyOS 的分布式能力 HarmonyOS ...

  5. Grok AI 是什么?

    原文链接:https://openaigptguide.com/grok-ai/ Grok AI是由马斯克推出的一款高级别的人工智能大语言模型,旨在帮助软件开发者以不同的口头语言交流和表达.它是基于多 ...

  6. Windows10+Python+Yolov8+ONNX图片缺陷识别,并在原图中标记缺陷,有onnx模型则无需配置,无需训练。

    目录 一.训练自己数据集的YOLOv8模型 1.博主电脑配置 2.深度学习GPU环境配置 3.yolov8深度学习环境准备 4.准备数据集 二.Python+Onnx模型进行图像缺陷检测,并在原图中标 ...

  7. day01预习-基本语法

    typora-copy-images-to: media 基本语法 JavaScript的历史: ​ 在95年以前,就有很多上网的用户了,当时的带宽只有28.8kb/s,用户要进行表单的验证时,点击提 ...

  8. 【Javaweb】五(Service类)

    一般Spring项目中处理业务的层为Service层,称为业务层.目前常见的风格有: 写法:Service层=Service接口+ServiceImpl实现类 AdminServiceImpl.jav ...

  9. 有什么巨好用Excel数据分析技巧?

    当涉及Excel数据分析时,以下是一些非常实用的技巧和功能,供您参考.这里将为您提供关于数据整理.数据清洗.统计分析.可视化和高级分析等方面的技巧. 一.数据整理与清洗: 导入数据:使用 Excel ...

  10. 吉特日化MES & 医药行业相关专业术语汇总