首页 > 其他分享 >给正在使用Lombok的朋友一些建议

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

时间:2023-10-21 10:34:22浏览次数:31  
标签:userName 建议 String 朋友 userId email Record Lombok public

大家好,我是老七,点个关注吧,将持续更新更多精彩内容!

给正在使用Lombok的朋友一些建议_构造函数

背景

随之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", "[email protected]", 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 = "[email protected]";

  // 类函数
  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 存在一些兼容性问题。


如果各位觉得老七的文章还不错的话,麻烦大家动动小手,

点赞、关注、转发走一波!!

有任何问题可以评论区留言或者私信我,我必将知无不言言无不尽!

标签:userName,建议,String,朋友,userId,email,Record,Lombok,public
From: https://blog.51cto.com/u_16277888/7965018

相关文章

  • 数据类型分类(看到建议看一下)
    数据类型分类按存值个数存一个值:整型/浮点型/字符串存多个值:列表/字典/元组/集合按有序无序有序:字符串/列表/元组无序:字典/集合按可变or不可变可变:列表/字典/集合不可变:整型/浮点型/字符串/元组......
  • PCB打板省钱小妙招,强烈建议收藏!
    很多PCB采购或工程师找PCB制造商做板的时候,觉得价格高,但是却不知道贵在哪里。是通过货比三家,选择价格最低的供应商?还是通过牺牲部分质量换取更低的成本?这些都不是最省钱的方式。如何在保证PCB高可靠的前提下合理优化成本?众所周知,PCB的制造成本取决多个因素,除在设计产品时应考虑这......
  • 最新整理的网络术语大全,强烈建议收藏!
    ACL(AccessControlList)英文全称:AccessControlList中文含义:访问控制列表原理:ACL是一种网络设备(如路由器、防火墙)上的规则集,用于控制数据包的流动。它基于IP地址、端口号和协议等规则,决定哪些数据包被允许通过,哪些被拒绝。用途:用于网络安全和控制,可以限制特定IP地址或协议......
  • ES集群调优建议
    9 ES集群调优建议9.1内核参数优化#对于操作系统,需要调整几个内核参数[root@node~]#vim/etc/sysctl.conffs.file-max=655360#设定系统最大打开文件描述符数,建议修改为655360或者更高,vm.max_map_count=262144#用于限制一个进程可以拥有的虚拟内存大小,建议修改成262144......
  • SQL执行顺序,优化的禁止项,建议项
    SQL执行顺序,优化的禁止项建议项SQL执行顺序如下:1.FROM,(-includingJOIN)2.WHERE3.GROUPBY4.HAVING5.WINDOWfunctions6.SELECT7.DISTINCT8.UNION9.ORDERBY10.LIMITandOFFSET·语句性能应注意两个方面:1)数据流的流向;2)orderbylimit场景。从执行顺序......
  • 关于项目管理的若干建议
    今天整理电脑,发现自己去年年初给老板写的这个很好,拿出来和大家分享一下《关于项目管理的若干建议》1、人尽其才,成本优先技术开发型公司最主要的管理就是人员的管理,如何最大程度的利用好现有人才,发挥其最大作用,也是成本控制的重要参数。技术开发人员按初级、中级、高级三个级别进......
  • 微信小程序分包体积优化建议
    代码包体积优化启动性能优化最直接的手段是降低代码包大小,代码包大小直接影响了下载耗时,影响用户启动小程序时的体验。开发者可以采取以下手段优化代码包体积:1.合理使用分包加载推荐所有小程序使用使用分包加载是优化小程序启动耗时效果最明显的手段。建议开发者按照功......
  • Gradle导致Lombok不生效问题
    现象从debug看是可以查询到数据的,但是返回起前端是没有数据的解决办法//引入lombok注解处理器annotationProcessor,不然lombok不会生效annotationProcessor('org.projectlombok:lombok')结果......
  • 【高级机器学习算法】6.机器学习应用建议
    模型评估模型评估是机器学习中非常重要的一部分,它可以帮助我们评估模型的好坏,从而选择最优的模型。评估方式在机器学习中,我们通常会将数据集划分为训练集和测试集,训练集用于训练模型,测试集用于评估模型的好坏。评估指标训练误差:模型在训练集上的误差,用于衡量模型在训练集上......
  • 科迪华数据科学家对基因组信息应用于植物育种的观点与建议
    本文内容整理自科迪华农业科学公司(CortevaAgriscience)的数量遗传学家AlencarXavier博士几年前做的报告。AlencarXavier在统计遗传学方面的工作是基因组辅助育种,重点是数据驱动的植物育种的理论和计算方面,例如使用各种信息来源进行建模、预测和选择。其研究涉及使用混合模型,贝叶......