1. Lombok 是什么
Lombok 提供了一组注解和工具,用于在编译期自动生成样板代码。这些样板代码通常是一些重复性的、无趣的、但是必需的代码,例如 getter
和 setter
方法、构造函数、equals
和 hashCode
方法等。借助 Lombok,你就不必手动编写这些繁琐的代码,它会在编译时自动帮你生成这些方法,让你的代码文件简洁而整洁。
2. Lombok 的用途
简化 Getter 和 Setter 方法: 在传统的 Java 开发中,你经常需要为每个类的属性手动编写 Getter 和 Setter 方法,但是有了 Lombok,你只需要在属性上加上 @Getter
和 @Setter
注解,Lombok 就会为你自动生成这些方法。
自动生成构造函数: 通过 @NoArgsConstructor
、@RequiredArgsConstructor
或 @AllArgsConstructor
注解,你可以快速生成无参构造函数、带有必需参数的构造函数或者带有全部参数的构造函数。
自动生成 equals 和 hashCode 方法: 通过 @EqualsAndHashCode
注解,Lombok 会根据类的字段自动生成 equals()
和 hashCode()
方法,让你的类更易于比较和使用在集合中。
日志记录更轻松: 使用 @Slf4j
注解,你可以直接在类中使用 log
对象,而无需手动创建日志记录器。
简化异常抛出: 通过 @SneakyThrows
注解,你可以在方法中抛出受检异常,而无需显式地在方法上声明或捕获它们。
数据类简化: 使用 @Data
注解,Lombok 会为你自动生成所有常用方法,如 Getter、Setter、toString()
等,让你的数据类更加简洁。
链式调用: 使用 @Builder
注解,Lombok 可以帮你创建一个更优雅的构建器模式,让你的对象初始化更加流畅。
3. 如何使用 Lombok
- 在你的 Java 项目中添加 Lombok 依赖
- 在 IDE 中安装好Lombok插件,
lombok
, 搜索该插件并安装 - idea开启
settings—>build—>compiler—>annotation—>勾选enable annotation processing
- 在类或字段上添加相应的注解即可
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version> <!-- 注意查看最新的 Lombok 版本,并替换此处的版本号 -->
<scope>provided</scope>
</dependency>
4. Lombok注解
4.1. @Getter @Setter 注解
@Getter
和 @Setter
是 Lombok 提供的两个注解,它们可以帮助我们自动在 Java 类中生成 getter
和 setter
方法
当然,如果你只想为某个特定的字段生成 getter
或者 setter
方法,那么你可以直接将注解加到字段上
4.2. @Constructor 注解
Lombok 的三个构造器注解:@NoArgsConstructor
, @RequiredArgsConstructor
和 @AllArgsConstructor
,这三个注解可以为你省去编写繁琐的构造方法的麻烦
@NoArgsConstructor
:这个注解会让 Lombok 为你的类生成一个无参数的构造方法
@RequiredArgsConstructor
:这个注解稍微复杂一些,它会让 Lombok 为你的类生成一个构造方法,构造方法的参数是类中所有需要特殊处理的字段,也就是说,标记为 final
和 @NonNull
的字段会被作为参数
@AllArgsConstructor
:这个注解会让 Lombok 为你的类生成一个包含所有字段的构造方法
4.3. @Builder 注解
Builder 设计模式是一种创建型设计模式,主要解决了一些对象的构造过程中的问题。它提供了一种链式方法来创建一个复杂的对象
Lombok 提供了 @Builder
注解,可以帮助我们简化 builder 模式的实现过程
例如,考虑一个 User 类,包含 name、age 和 email 这三个字段。如果我们希望通过 Builder 模式创建 User 对象,那么可以这样做
import lombok.Builder;
import lombok.ToString;
@Builder
@ToString
public class User {
private String name;
private int age;
private String email;
}
然后,我们可以通过下面的方式来创建 User 对象
User user = User.builder()
.name("Tom")
.age(25)
.email("tom@example.com")
.build();
System.out.println(user);
这段代码会输出:User(name=Tom, age=25, email="tom@example.com"
从上面的例子可以看出,Lombok 生成了一个名为 builder 的静态方法,以及 name,age 和 email 的链式设置方法,最后通过 build 方法来构建 User 对象
4.4. @Value 注解
@Value
是 Lombok 提供的一个强大的注解,可以帮助我们快速创建不可变类
使用 @Value
非常简单,只需要在类定义上添加 @Value
注解即可
自动为所有字段添加 private final
修饰符,使得它们在初始化后就不能再被改变。
自动生成所有字段的 Getter 方法,因为字段是 final
的,所以没有 Setter 方法。
自动生成 equals()
, hashCode()
和 toString()
方法。
自动生成一个全参数的构造方法。
实际上,@Value
就是 @Getter @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @AllArgsConstructor @EqualsAndHashCode @ToString
的集合
4.5. @Log 系列注解
Lombok 提供了 @Log
系列注解,用于自动创建并初始化日志记录器。这一系列注解包括:@Log
, @Log4j
, @Log4j2
, @Slf4j
, @JBossLog
等,对应于不同的日志框架。每个注解都会在编译时生成一个名为 log
的静态字段,该字段被初始化为对应的日志框架的 Logger 实例
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class LogExample {
public void doSomething() {
// 直接使用 log 记录日志
log.info("This is an information message.");
log.error("This is an error message.");
}
}
4.6. @Data 注解
@Data
是个万金油注解。一个 @Data
注解相当于同时使用了 @Getter
、@Setter
、@RequiredArgsConstructor
、@ToString
、@EqualsAndHashCode
5. Lombok 实现原理
Lombok 实现了一系列自己的注解处理器,每一个处理器都负责处理一种或几种注解
仅作用于编译阶段:由于 Lombok 是在编译阶段修改语法树,所以它不能处理运行时的注解
6. 避免 Lombok 的常见陷阱
6.1. 慎用 @Data
@Data
是一个实用的注解,它包含了 @Getter
、@Setter
、@ToString
、@EqualsAndHashCode
和 @RequiredArgsConstructor
。这在一般情况下非常方便,但是当你需要自定义一些方法时,就可能会遇到问题。
例如,你可能需要自定义 equals
和 hashCode
方法,但是由于 @Data
注解自动生成了这些方法,所以你的自定义方法会被覆盖。
6.2. 不要滥用 Lombok
虽然 Lombok 的注解可以极大地简化我们的代码,但是这并不意味着我们应该在所有地方都使用它。在一些情况下,手动编写代码可能会更好。
例如,你可能需要自定义某个字段的 getter 或 setter 方法,或者你需要自定义 equals
、hashCode
或 toString
方法。在这些情况下,使用 Lombok 的注解可能会导致你的自定义代码被覆盖