ToB企服应用市场:ToB评测及商务社交产业平台

标题: 使用Java 17中的record替代Lombok的部分功能 [打印本页]

作者: 老婆出轨    时间: 2024-3-30 19:28
标题: 使用Java 17中的record替代Lombok的部分功能
在DD长期更新的Java新特性专栏中,已经介绍过Java 16中开始支持的新特性:record的使用。
之前只是做了介绍,但没有结合之前的编码习惯或规范来聊聊未来的应用变化。最近正好因为互相review一些合作伙伴的代码,产生了一些讨论话题,主要正针对于有了record之后,其实之前有些用Lombok的场景,是可以替换掉了。
今天我们就来小小的总结下,我们可以在哪些地方,利用record来替换Lombok。
Lombok的威力

Lombok是我一直都喜欢使用的工具,因为它可以让我们的代码变的更加整洁。比如:当我们要写一个User对象的时候,如果不使用Lombok,往往需要写这么多内容:
  1. public class User {
  2.     private String username;
  3.     private String email;
  4.     private int userId;
  5.     public User(String username, String email, int userId) {
  6.         this.username = username;
  7.         this.email = email;
  8.         this.userId = userId;
  9.     }
  10.     public String getUsername() {
  11.         return username;
  12.     }
  13.     public void setUsername(String username) {
  14.         this.username = username;
  15.     }
  16.     public String getEmail() {
  17.         return email;
  18.     }
  19.     public void setEmail(String email) {
  20.         this.email = email;
  21.     }
  22.     public int getUserId() {
  23.         return userId;
  24.     }
  25.     public void setUserId(int userId) {
  26.         this.userId = userId;
  27.     }
  28.     @Override
  29.     public boolean equals(Object o) {
  30.         if (this == o) return true;
  31.         if (o == null || getClass() != o.getClass()) return false;
  32.         User user = (User) o;
  33.         if (userId != user.userId) return false;
  34.         if (username != null ? !username.equals(user.username) : user.username != null) return false;
  35.         return email != null ? email.equals(user.email) : user.email == null;
  36.     }
  37.     @Override
  38.     public int hashCode() {
  39.         int result = username != null ? username.hashCode() : 0;
  40.         result = 31 * result + (email != null ? email.hashCode() : 0);
  41.         result = 31 * result + userId;
  42.         return result;
  43.     }
  44.     @Override
  45.     public String toString() {
  46.         return "User{" +
  47.                 "username='" + username + '\'' +
  48.                 ", email='" + email + '\'' +
  49.                 ", userId=" + userId +
  50.                 '}';
  51.     }
  52. }
复制代码
在有了Lombok之后呢,通过使用@Data注解,可以将以上内容缩减到只需要下面这几行即可:
  1. @Data
  2. public class User {
  3.     private String username;
  4.     private String email;
  5.     private int userId;
  6. }
复制代码
@Data注解涵盖了@Getter、@Setter、@EqualsAndHashCode 和 @toString,所以一个注解就可以实现成员变量的Getter和Setter,equals和hashcode方法的重写,以及toString的重写。大大降低了代码量,让代码看上去更加整洁。
Lombok的问题

虽然Lombok可以帮助我们少些很多代码,但它依然有一些缺点,比如:
使用record来替代

在之前的Java 新特性:record一文中,已经提到过record类可以根据类的字段自动生成:构造函数、equals()、hashCode() 和 toString()。这个功能就跟上面我们演示的Lombok中的@Data非常类似。
写法的话也非常简单,只需要这样一行即可搞定:
  1. public record UserRecord(String username, String email, int userId) {}
复制代码
可以看到该代码的整洁度比Lombok的实现更加干净。同时,最关键的一点,这是Java原生支持的,不需要引入任何第三方依赖!
record类定义完成了,具体使用的话就跟平时使用其他类一样,去创建实例和调用方法即可,比如下面这样:
  1. UserRecord userRecord = new UserRecord("didi", "didi@didispace.com", 35);
  2. System.out.println(userRecord.email());
  3. System.out.println(userRecord.toString());
复制代码
只是,我们在使用的时候需要了解record自动生成的代码与Lombok的区别,就能马上上手。
比如,从上面的例子中我们可以看到一个区别:获取成员变量email的时候,这里并不想传统getter那样以getEmail()的形式生成。
哪些情况替代不了?

record类已经很强大,但目前并不能完全替代Lombok。主要原因如下:
因此,在用record替代Lombok的时候,更多用来定义静态变量,而不是可能会变化的实例变量。但是,由于record中也可以定义函数,所以对于一些对成员计算获得的内容,也可以实现和使用。
总结

Lombok和record都可以帮助我们编写更加整洁的代码。前者是第三方库,可能存在一些不可预知的问题和IDE兼容问题,但功能更加全面和强大;后者属于Java原生的能力,功能虽弱一些,但用好它也能帮助我们减少很多代码的编写,且IDE兼容性更好。
好了,今天的分享就到这里。如果您学习过程中如遇困难?可以加入我们超高质量的技术交流群,参与交流与讨论,更好的学习与进步!更多Java新特性教程可以点击直达!,欢迎收藏与转发支持!
欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4