Lombok注解

Posted by Wh0ami-hy on June 27, 2024

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 方法,或者你需要自定义 equalshashCode 或 toString 方法。在这些情况下,使用 Lombok 的注解可能会导致你的自定义代码被覆盖


本站总访问量