Lombok Java

2025年12月5日 | 13分钟阅读

Java 是最流行的面向对象编程语言,但它也有一些缺点。主要的缺点是需要编写大量的样板代码。为了克服这个缺点,Lombok 项目应运而生。它是一个可以为您的 Java 应用程序增添色彩的工具。在本节中,我们将讨论Lombok 项目、功能、Lombok 包

Lombok Java

什么是 Lombok 项目?

Lombok 项目是一个流行且广泛使用的 Java 库,可以最小化或消除样板代码。它可以节省时间和精力。只需使用注解,我们就可以节省空间并提高源代码的可读性。它可以自动集成到 IDE 和构建工具中,为您的 Java 应用程序增添色彩。

这是通过引入注解来实现的,这些注解可以自动创建 getter、setter、构造函数、equals()、hashCode() 和 toString() 方法——所有这些都是典型的 Java 代码结构。

这里会有一个问题:Lombok 项目和 IDE 是否做相同的工作?如果是,Lombok 有什么用?

答案是否定的,IDE 和 Lombok 的工作不同,但非常相似。当我们使用 IDE 生成这些样板代码(getter 和 setter)时,我们节省了手动编写 getter 和 setter 的精力,但它们实际上存在于源代码中,增加了代码行数,降低了可维护性和可读性。而 Lombok 项目则在编译时将所有这些样板代码添加到类文件中,而不是添加到原始源代码中。

Lombok Java API 包含以下可用于不同目的的包。

  • lombok
  • experimental
  • extern.apachecommons
  • extern.flogger
  • extern.java
  • extern.jbosslog
  • extern.log4j
  • extern.slf4j

为什么选择 Lombok 项目?

假设我们正在开发一个 Java 应用程序,其中需要一个具有多个私有字段的 POJO 文件。对于这些字段,我们必须生成 getter 和 setter 访问方法以提供访问。为每个字段生成 getter 和 setter 会增加代码行数。

此外,添加一个构造函数和一个 toString() 方法会产生更多的代码行数,并导致混乱。当我们使用需要在使用后关闭的 Java 对象时,需要编码 finally-block 或使用 try-with-resources 来确保对象关闭。添加 finally-block 样板代码来关闭对象会使代码产生大量混乱。因此,我们处理大量的样板代码。

为了解决同样的问题,Lombok 项目应运而生。

Lombok 项目提供了各种注解,可用于生成常见的 Java 代码结构,例如:

  1. @Getter 和 @Setter:为字段自动生成 getter 和 setter 方法。
  2. @ToString:为类生成一个 toString() 方法,包括所有非静态字段。
  3. @EqualsAndHashCode:基于类的字段生成 equals() 和 hashCode() 方法。
  4. @NoArgsConstructor、@RequiredArgsConstructor 和 @AllArgsConstructor:分别生成无参构造函数、必需参数构造函数和所有参数构造函数。
  5. @Builder:为类实现 builder 模式,支持流畅的对象创建。
  6. @Cleanup:在使用后自动关闭资源,例如流或连接,从而减少手动资源管理的需求。

这些注解使开发人员能够减少手动编写样板代码的数量,从而提高代码的可读性和可维护性。

Lombok 项目的特点

  1. 样板代码减少:Lombok 通过自动生成 getter、setter、构造函数、equals、hashCode 和 toString 方法等常见代码结构,减少了 Java 应用程序所需的样板代码量。
  2. 基于注解的方法:开发人员可以使用简单的注解来替换冗长的样板代码,使代码库更简洁、更精炼。
  3. 提高可读性和可维护性:通过消除重复的代码,Lombok 提高了代码的可读性,并减少了出错的可能性。它还通过减少源文件中的混乱来提高可维护性。
  4. 提高生产力:Lombok 使开发人员能够更高效地编写代码,节省了手动编写和维护样板代码所需的时间和精力。
  5. IDE 兼容性:Lombok 与所有流行的 IDE(如 IntelliJ IDEA、Eclipse 和 NetBeans)兼容,使开发人员能够将其无缝集成到他们的开发工作流程中。
  6. Delombok 工具:Lombok 提供了一个名为 delombok 的工具,可用于撤销 Lombok 注解的效果,并将原始源代码恢复为添加了所有样板代码的状态。这对于代码分析、调试或与不使用 Lombok 的开发人员共享代码可能很有用。
  7. 空值检查:Lombok 提供了用于检查空值的注解,通过在需要时自动添加空值检查,帮助开发人员编写更健壮和防御性的代码。
  8. 简洁的数据对象:Lombok 通过根据类中定义的字段自动生成 getter、setter、构造函数和其他方法,简化了数据对象的创建。
  9. 轻松清理:Lombok 提供 @Cleanup 等注解,可在使用后自动关闭资源,从而降低了资源泄露的风险并简化了资源管理代码。
  10. 安全锁定:Lombok 提供了安全锁定机制的注解,例如 @Synchronized,以简化并发编程并避免常见的同步陷阱。
  11. 轻松日志记录:Lombok 提供了用于日志记录的注解,例如 @Slf4j,它会自动生成日志记录代码,减少了手动编写日志记录样板代码的需求,并使跨代码库的日志记录配置更加一致。

Java Lombok 包

该包包含使用 Lombok 所需的所有注解和类。除以下两个包外,所有其他包仅适用于扩展 Lombok 以供自己使用的人员。

  • lombok.extern.*:这些包包含 Lombok 注解,可用于减少库的样板代码问题。它本身不是 JRE 的一部分。
  • lombok.experimental:该包包含 Lombok 的新功能,或者在承诺长期支持之前可能会发生变化的功能。

@ToString、@EqualsAndHashCode、@NonNull、@NoArgsConstructor 和 @AllArgsConstructor 是几个常用的 Lombok 类和注解。通过自动生成构造函数、toString()、equals() 和 hashCode() 方法、可空性测试和其他功能。这些注解减少了人工实现的需要,并有助于简化代码。

Java Lombok 包包含以下类和注解。

Class描述
ConfigurationKeys包含所有不属于特定注解的 Lombok 配置键的容器类。
Lombok用于操作 Lombok 生成代码的有用实用方法。
枚举
AccessLevel表示访问级别。
注解
注解描述
AllArgsConstructor生成一个全参数构造函数。
Builderbuilder 注解将所谓的“builder”方面添加到带注解的类或包含带 @Builder 注解的成员的类中。
Builder.Default带 @Default 注解的字段必须有一个初始化表达式;该表达式被视为在构建期间未明确设置时使用的默认值。
Builder.ObtainVia应用于字段(在类型上为 @Builder)或参数(为构造函数或静态方法上的 @Builder)以指示 Lombok 如何给定实例获取此字段或参数的值;这仅在 toBuilder 为 true 时相关。
Cleanup确保您注解的变量声明将被调用其 close 方法进行清理,无论发生什么。
CustomLog使 Lombok 基于自定义日志记录器实现生成一个日志记录器字段。
数据为所有字段生成 getter、一个有用的 toString() 方法,以及检查所有非瞬态字段的 hashCode() 和 equals() 实现。
Delegate将对注解字段的方法调用自动委托给提供的委托对象。
EqualsAndHashCode基于相关字段生成所有对象继承的 equals 和 hashCode() 方法的实现。
EqualsAndHashCode.Exclude如果存在,请勿将此字段包含在生成的 equals 和 hashCode() 方法中。
EqualsAndHashCode.Include配置此成员在 equals() 和 hashCode() 方法实现中的行为;如果应用于方法,则将方法的返回值作为计算 hashCode/相等性的部分。
ExtensionMethod通过在辅助类中定义静态方法,允许将方法添加到现有类中。
FieldDefaults设置带注解的类中字段的默认访问级别。
FieldNameConstants为带注解的类中的字段名生成常量。
GeneratedLombok 最终将自动将此注解添加到所有生成的构造函数、方法、字段和类型。
Getter应用于任何字段,使 Lombok 构建一个标准的 getter。
NoArgsConstructor生成一个无参构造函数。
NonNull如果应用于参数,Lombok 将在方法/构造函数体的开头插入一个空值检查,并抛出一个以参数名为消息的 NullPointerException。不能用 @NonNull 注解原始参数。
RequiredArgsConstructor生成一个包含必需参数的构造函数。
Setter应用于任何字段,使 Lombok 构建一个标准的 setter。
Singularsingular 注解与 @Builder 一起使用,为集合创建单个元素的“add”方法。
SneakyThrows@SneakyThrow 将避免 javac 坚持您必须捕获或继续抛出方法体声明它们生成的任何检查型异常。
同步几乎与将“synchronized”关键字放在方法上完全一样,但它会在一个私有的内部对象上同步,这样不受您控制的其他代码就不会通过锁定您自己的实例来干扰线程管理。
ToString生成所有对象继承的 toString() 方法的实现,该实现由相关字段的值组成。
ToString.Exclude如果存在,请勿将此字段包含在生成的 toString() 中。
ToString.Include配置此成员在 toString() 中的渲染方式;如果应用于方法,则将方法的返回值包含在输出中。
val将 val 用作任何局部变量声明(包括 in 循环)的类型,并且类型将从初始化表达式中推断出来。
生成大量符合类表示不可变实体的代码。
var将 var 用作任何局部变量声明(包括 in 循环)的类型,并且类型将从初始化表达式中推断出来(对变量的任何进一步赋值都不参与此类型推断)。
UtilityClass将一个类标记为工具类,确保它不能被实例化并添加私有构造函数。
With应用于任何字段,使 Lombok 构建一个“with”方法,该方法会生成该对象的克隆(除了 1 个字段会被赋予新值)。
Wither生成一个类似于 'With' 的 'with' 方法,但它返回原始对象的修改副本,而不是创建一个新对象。

使用 Lombok 项目的目的

使用 Lombok 有几个原因,其中一些如下:

检查空值

这是 Lombok 提供的最基本的功能。该库提供了 @NonNull 注解,可用于在 setter 字段上生成空值检查。如果带注解的类字段包含空值,它将抛出 NullPointerException。请注意,我们不能注解原始参数。使用 @NonNull 注解。例如,考虑以下代码片段。

上面的代码与

简洁的数据对象

如果 POJO 文件中有多个私有字段,则生成 getter 和 setter 可能是一项繁琐的工作。使用 Lombok 的 @Getter@Setter 注解可以轻松完成这项工作。例如,考虑以下代码。

未使用 Lombok 项目

使用 Lombok 项目

我们观察到代码变得更加简洁且不易出错。请注意,@Getter 和 @Setter 注解还接受一个可选参数来指定访问级别(如果需要)。一个好处是它负责命名约定。例如,它为布尔字段生成一个以 is 开头的访问方法,而不是 get。如果它们应用于类级别,则为类中的每个非静态字段生成 getter 和 setter。

生成 Getter 和 Setter

@Data 注解可用于应用所有注解背后的功能。这意味着用 @Data 注解一个类,Lombok 会为所有非静态类字段生成 getter 和 setter,以及一个类构造函数。它与 toString()、equals() 和 hashCode() 策略相同。它使 POJO 的编码异常简单。

注意:如果我们手动创建 getter 和 setter,Lombok 不会生成代码,即使字段已带注解。

自动生成构造函数

它提供了两个注解来生成构造函数,即 @AllArgsConstructor@NoArgsConstructor@AllArgsConstructor 注解生成一个包含所有声明字段的构造函数。如果添加或删除了任何字段,构造函数也会随之更改。@NoArgsConstructor 注解仅生成不带参数的构造函数。

为 Final 字段生成 Getter

@Value 注解与 @Data 注解相同。它是一个类级别的注解。唯一的区别是它生成一个不可变类。它会自动为所有私有final字段生成 getter。请注意,它不会为任何字段生成setter,并将类标记为 final。

减少样板代码

Lombok 有助于减少开发人员需要编写的样板代码量,例如 getter、setter、构造函数和 toString() 方法。它允许开发人员将更多精力放在编写业务逻辑而不是重复性代码上。

不可变对象

Lombok 提供了 @Value 和 @Wither 等注解,可轻松创建不可变对象。不可变对象是线程安全的,有助于防止对象状态意外更改。

Builder 模式

借助 Lombok 的 @Builder 注解,开发人员可以轻松地为他们的类实现 builder 模式,从而实现更具可读性和更流畅的对象创建。

日志集成

Lombok 提供了 @Slf4j 和 @Log 等注解,可在类中自动生成日志记录器字段,使日志集成更轻松,跨代码库更一致。

自动 Equals 和 HashCode

Lombok 的 @EqualsAndHashCode 注解根据类的字段生成 equals() 和 hashCode() 方法的实现,从而降低了错误风险并确保了行为的一致性。

简化的异常处理

Lombok 的 @SneakyThrows 注解允许开发人员在不声明检查型异常的情况下抛出它们,从而减少了代码混乱并提高了可读性。

简洁的空值检查

除了 @NonNull,Lombok 还提供了 @Nullable 和 @Cleanup 等注解,以分别简化空值检查和资源清理。

Lombok 提供了范围广泛的功能和注解,通过减少冗长和消除重复任务,可以极大地提高 Java 项目的生产力和代码质量。

在 Eclipse IDE 中配置 Lombok

要将 Lombok 项目配置到 Eclipse IDE 中,请按照以下步骤操作:

步骤 1:首先,下载 lombok.jar 文件。

步骤 2:要执行上述 JAR 文件,请双击下载的 JAR 文件。屏幕上会出现一个 GUI,我们在其中指定要在其上配置 Lombok 项目的 IDE。

Lombok Java

步骤 3:单击指定位置按钮,然后浏览安装 Eclipse IDE 的目录。从文件夹中选择 eclipse.exe 文件。

Lombok Java

步骤 4:单击安装/更新按钮。

完成上述过程后,请检查项目 Lombok 是否已成功安装。

步骤 5:打开 eclipse IDE -> 帮助 -> 关于 Eclipse IDE。如果列出了 Lombok 项目,则表示已正确安装。

Lombok Java

步骤 6:最后,单击关闭按钮。

Lombok 项目已成功集成到 Eclipse IDE 中。

未使用 Lombok 的 Java 程序

首先,我们将创建一个不使用 Lombok 的 Java 程序,以查看区别。

Student.java

WithoutLombok.java

输出

Student [studentId=1, studentName=John Doe, studentClass=Class 10, studentEmailId=john.doe@example.com]
Student ID: 1
Student Name: John Doe
Student Class: Class 10
Student Email ID: john.doe@example.com
Student [studentId=1, studentName=Jane Doe, studentClass=Class 11, studentEmailId=jane.doe@example.com]

解释

提供的 Java 代码定义了一个 Student 类,其中包含 studentId、studentName、studentClass 和 studentEmailId 等私有属性,代表学生的各种详细信息。它包含一个默认构造函数和一个参数化构造函数来初始化这些属性。此外,还为每个属性手动实现了 getter 和 setter 方法,以提供访问和修改功能。toString() 方法被重写,以返回 Student 对象的字符串表示形式,连接其属性。

要运行该程序,您通常会创建一个单独的主类(Main class),其中包含一个 main 方法,在该方法中实例化 Student 类,在必要时使用 setter 方法设置其属性,并通过 toString() 方法或单个 getter 方法打印其详细信息。此代码展示了 Java 中面向对象编程的一个简单示例,演示了 Student 类的对象的创建和操作。

让我们用 Lombok 来考虑上面的代码。

带有 Lombok 的 Java 程序

在以下程序中,我们使用了常用的 Lombok 注解来使我们的代码简洁。

Employee.java

WithLombok.java

输出

Student(sttudentId=1, studentName=John Doe, studentClass=Class 10, studentEmailId=john.doe@example.com)
Student ID: 1
Student Name: John Doe
Student Class: Class 10
Student Email ID: john.doe@example.com

解释

提供的 Java 代码利用 Lombok 注解来更有效地定义 Student 类。该代码通过使用 @NoArgsConstructor、@AllArgsConstructor、@Getter、@Setter 和 @ToString 等注解,消除了显式实现构造函数、getter 和 setter 方法以及 toString() 函数的需要。

@NoArgsConstructor 注解由一个不带参数的构造函数生成,而 @AllArgsConstructor 注解由类中每个字段的参数构造函数生成。toString() 函数返回对象状态的字符串表示形式,可以通过 @ToString 注解自动创建。此外,@Getter 和 @Setter 注解由类字段的 getter 和 setter 方法生成。