网站Logo Ilren 小记

一文彻底掌握 Lombok:提升 Java 开发效率的利器

jack
3
2023-03-15

引言

在 Java 开发中,我们经常会写大量重复的样板代码,比如 Getter、Setter、构造函数、toString、equals、hashCode 等。虽然这些代码对功能没有直接影响,但却极大降低了代码的可读性和开发效率。

为了解决这个痛点,Lombok 应运而生。

本文将全面介绍 Lombok 的核心功能、使用方法、注意事项,以及在实际项目中的最佳实践,帮助你轻松写出简洁、优雅的 Java 代码。

一、什么是 Lombok?

Lombok 是一个 Java 库,它通过注解的方式,在编译期自动生成样板代码,从而减少开发人员的重复劳动。

  • 优点

    • 简化代码结构,提升可读性

    • 降低出错率(手写 getter/setter 易出错)

    • 兼容 Spring、JPA、MapStruct 等常见框架

二、如何引入 Lombok?

1. Maven 依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${lombok.version}</version> <!-- 建议使用最新稳定版本 -->
    <scope>provided</scope>
</dependency>

注意:scope 使用 provided 是因为 Lombok 只在编译期生效,不参与运行时。

2. IDEA 插件支持

如果使用 IDEA,请确保安装并启用 Lombok 插件:

  • File -> Settings -> Plugins -> 搜索 Lombok 并安装

  • File -> Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processors 勾选 Enable annotation processing

三、常用注解详解

1. @Getter / @Setter

为类字段自动生成 getter 和 setter 方法。

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class User {
    private String name;
    private int age;
}

2. @ToString

自动生成 toString() 方法。

@ToString
public class User {
    private String name;
    private int age;
}

支持排除字段:

@ToString(exclude = "password")
public class User {
    private String name;
    private String password;
}

3. @EqualsAndHashCode

自动生成 equals()hashCode() 方法。

@EqualsAndHashCode
public class User {
    private String name;
    private int age;
}

4. @NoArgsConstructor / @AllArgsConstructor / @RequiredArgsConstructor

生成构造函数:

  • @NoArgsConstructor: 无参构造

  • @AllArgsConstructor: 所有字段的构造函数

  • @RequiredArgsConstructor: final 和 @NonNull 字段的构造函数

@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private int age;
}

5. @Data

@Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor 的组合注解。

@Data
public class User {
    private String name;
    private int age;
}

6. @Builder

提供 Builder 模式的支持(类似链式调用)。

@Builder
public class User {
    private String name;
    private int age;
}

使用方式:

User user = User.builder()
                .name("张三")
                .age(25)
                .build();

7. @Value(不可变类)

将类设为不可变对象,相当于:

@Getter
@ToString
@EqualsAndHashCode
@AllArgsConstructor
@FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE)
@Value
public class Point {
    int x;
    int y;
}

8. @SneakyThrows

自动捕获检查型异常,不强制手动 try-catch。

@SneakyThrows
public void readFile() {
    Files.readAllLines(Paths.get("xxx.txt")); // 不再需要捕获 IOException
}

9. @Cleanup

自动资源关闭,类似 try-with-resources。

@SneakyThrows
public void test() {
    @Cleanup InputStream in = new FileInputStream("xxx.txt");
    // 自动关闭 in
}

四、Lombok + SpringBoot 示例

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserDTO {
    private String name;
    private Integer age;
}

在 Controller 中直接使用:

@RestController
public class UserController {

    @GetMapping("/user")
    public UserDTO getUser() {
        return UserDTO.builder()
                      .name("张三")
                      .age(20)
                      .build();
    }
}

五、注意事项与坑点

  1. IDE 需要支持注解处理器,否则 Lombok 不生效

  2. Lombok 生成的是编译期代码,不在源码中直接体现,不利于调试

  3. 不适合做公开 SDK 或类库接口(暴露了自动生成代码,影响可维护性)

  4. 某些注解组合使用会冲突,如 @Data@Builder 可能需要加 @NoArgsConstructor(force = true)

  5. 与 JPA 的 @Entity 一起使用时,推荐手动写构造函数,避免 Lombok 的构造与代理机制冲突

六、Lombok 与 Record(JDK 14+)对比

Java 14+ 引入了 record 类型,也可用于生成不可变数据类,但功能较 Lombok 更有限。

public record User(String name, int age) {}

Lombok 在兼容性、扩展性方面依然更强,适合更复杂的业务场景。

七、总结

注解

功能

@Getter / @Setter

自动生成 getter/setter

@ToString

自动生成 toString 方法

@EqualsAndHashCode

自动生成 equals 和 hashCode

@NoArgsConstructor / @AllArgsConstructor

构造函数生成

@Data

综合常用注解

@Builder

链式构造器

@Value

不可变类

@SneakyThrows

忽略异常声明

@Cleanup

自动关闭资源

一句话总结:用好 Lombok,让你从“代码搬运工”变成“架构小能手”。

动物装饰