Lombok 配置使用

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

1. Lombok 的安装和配置

1.1 Maven 配置

在 pom.xml 中添加 Lombok 依赖:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.32</version> <!-- 请根据实际情况选择版本 -->
    <scope>provided</scope>
</dependency>

1.2 Gradle 配置

在 build.gradle 中添加:

dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.32'
    annotationProcessor 'org.projectlombok:lombok:1.18.32'
}

1.3 IDE 配置

  • IntelliJ IDEA:安装 Lombok 插件(Settings -> Plugins -> 搜索 Lombok)。
  • Eclipse:安装 Lombok 插件,或者运行 Lombok jar 文件并选择 Eclipse 安装目录。

2. Lombok 常用注解详解

2.1 @Getter / @Setter

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

import lombok.Getter;
import lombok.Setter;

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

也可以只在字段上使用:

 

@Getter
private String name;
@Setter
private int age;

2.2 @ToString

自动生成 toString() 方法。

import lombok.ToString;

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

2.3 @EqualsAndHashCode

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

import lombok.EqualsAndHashCode;

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

2.4 @NoArgsConstructor / @AllArgsConstructor / @RequiredArgsConstructor

自动生成无参、全参、必需参数(final 字段或带 @NonNull 字段)的构造方法。

 

import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;

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

2.5 @Data

集成了 @Getter、@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor。

import lombok.Data;

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

2.6 @Builder

实现建造者模式,适用于复杂对象的创建。

 

import lombok.Builder;

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

使用方式:

User user = User.builder().name("Tom").age(18).build();

2.7 @Value

不可变类(final class,所有字段为 private final,只有 getter,无 setter)。

import lombok.Value;

@Value
public class User {
    String name;
    int age;
}

2.8 @Slf4j

自动为类生成日志对象(private static final org.slf4j.Logger log)。

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class UserService {
    public void test() {
        log.info("Hello Lombok!");
    }
}

3. Lombok 配置文件(lombok.config)

Lombok 支持通过 lombok.config 文件进行个性化配置,放在项目根目录或包目录下。

常用配置项:

 

# 是否启用 Lombok
lombok.enabled = true

# getter/setter 是否生成为 public
lombok.accessors.chain = true

# 是否在生成的 getter/setter 上添加 @Generated 注解
lombok.addGeneratedAnnotation = true

更多配置项参考官方文档:Lombok Configuration System


4. Lombok 使用注意事项

  • Lombok 是编译期工具,对源码进行修改,IDE 必须支持 Lombok,否则会报错。
  • Lombok 生成的代码不会直接出现在源码中,而是编译后有效。
  • Lombok 可能与部分工具(如 MapStruct)或某些代码检查工具有兼容性问题。

5. Lombok 实用示例

import lombok.Data;
import lombok.Builder;
import lombok.extern.slf4j.Slf4j;

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

    public void printInfo() {
        log.info("User info: {}", this.toString());
    }
}

7. Lombok 进阶用法

7.1 @Accessors

自定义 getter/setter 的生成方式。常用于链式调用或自定义前缀。

 

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true) // 允许链式调用
public class User {
    private String name;
    private int age;
}

// 用法
User user = new User().setName("Tom").setAge(20);

常用参数:

  • chain = true:返回 this,实现链式调用。
  • fluent = true:去掉 get/set 前缀,直接用字段名作为方法名。

7.2 @Singular

与 @Builder 配合使用,自动支持集合的单个元素添加。

import lombok.Builder;
import lombok.Singular;
import java.util.List;

@Builder
public class UserGroup {
    @Singular
    private List<String> users;
}

// 用法
UserGroup group = UserGroup.builder()
    .user("Tom")
    .user("Jerry")
    .build();

7.3 @NonNull

为参数或字段添加非空校验,自动生成判空代码。

import lombok.NonNull;

public class User {
    private String name;

    public User(@NonNull String name) {
        this.name = name;
    }
}

7.4 @Cleanup

自动资源释放,类似 try-with-resources。

import lombok.Cleanup;
import java.io.*;

public void readFile(String file) throws IOException {
    @Cleanup InputStream in = new FileInputStream(file);
    // 使用 in,无需手动关闭
}

7.5 @Synchronized

线程安全的同步方法,避免直接用 synchronized 关键字。

import lombok.Synchronized;

public class Counter {
    private int count = 0;

    @Synchronized
    public void increment() {
        count++;
    }
}

8. Lombok 与其他框架集成

8.1 Lombok 与 Spring

Lombok 常与 Spring Boot 配合,简化实体类、DTO、VO、Service 等代码。
常见注解组合:@Data@Builder@Slf4j

注意事项:

  • @RequiredArgsConstructor 可与 Spring 的 @Autowired 配合,自动注入 final 字段。

 

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class UserService {
    private final UserRepository userRepository;
}

8.2 Lombok 与 JPA/Hibernate

  • 建议不要在实体类上用 @Data,而是用 @Getter@Setter,以避免equalshashCodetoString 方法引起懒加载问题。
  • 构造方法建议使用 @NoArgsConstructor 和 @AllArgsConstructor,JPA 需要无参构造器。

9. Lombok 常见问题与解决

9.1 Lombok 注解无效/报错

  • 检查 IDE 是否安装了 Lombok 插件。
  • 检查 Lombok 依赖是否添加且版本兼容。

9.2 Lombok 生成的代码看不到

  • Lombok 只在编译期间生成代码,源码中不可见。可通过 IDE 的 “Show Generated Sources” 或反编译 class 文件查看。

9.3 Lombok 与 MapStruct 冲突

  • MapStruct 依赖 getter/setter,建议用 @Getter/@Setter,避免只用 @Data

9.4 Lombok 与序列化

  • Lombok 生成的构造器、getter/setter 支持序列化,但如有自定义逻辑需手动实现。

10. Lombok 常用组合推荐

场景推荐注解组合
DTO/VO@Data / @Builder
实体类(JPA)@Getter / @Setter / @NoArgsConstructor
Service@Slf4j / @RequiredArgsConstructor
工具类@UtilityClass

11. Lombok 的优缺点

优点

  • 大幅减少样板代码,提高开发效率。
  • 代码更简洁、易于维护。
  • 支持主流 IDE 和构建工具。

缺点

  • 依赖 IDE 插件,部分工具兼容性有限。
  • 生成代码不可见,调试时需注意。
  • 部分注解(如 @Data)可能引发 equals/hashCode 问题。

12. Lombok 相关资源

 


13. Lombok 高级实用技巧

13.1 @Value 进阶用法

@Value 用于不可变对象,所有字段自动变为 private final,类自动加 final,只生成 getter,不生成 setter。

import lombok.Value;

@Value
public class Point {
    int x;
    int y;
}

适用场景:VO、DTO、常量类,线程安全的数据传递对象。

13.2 @Builder.Default

有时候用 @Builder 构建对象时,某些字段希望有默认值,可以用 @Builder.Default

import lombok.Builder;

@Builder
public class User {
    private String name;
    @Builder.Default
    private int age = 18;
}

注意:默认值必须直接赋值,不能在构造器或初始化块中赋值。

13.3 @SuperBuilder

当类有继承关系时,@Builder 不支持父类字段的构建。@SuperBuilder 解决此问题。

 

import lombok.experimental.SuperBuilder;

@SuperBuilder
public class Parent {
    private String parentField;
}

@SuperBuilder
public class Child extends Parent {
    private String childField;
}

// 用法
Child child = Child.builder()
    .parentField("p")
    .childField("c")
    .build();

13.4 @UtilityClass

用于工具类,自动将类设为 final,构造器私有,所有方法为静态。

import lombok.experimental.UtilityClass;

@UtilityClass
public class MathUtils {
    public int add(int a, int b) {
        return a + b;
    }
}

13.5 @Delegate

实现委托模式,把方法委托给某个字段。

 

import lombok.experimental.Delegate;

public class Printer {
    @Delegate
    private final PrintStream out = System.out;

    // Printer 可以直接调用 PrintStream 的方法
}


14. Lombok 在团队开发中的最佳实践

  1. 明确注解使用规范
    制定 Lombok 注解在项目中的使用规范,避免滥用。如实体类慎用 @Data,推荐用 @Getter/@Setter

  2. 代码审查注意 Lombok 生成方法
    代码评审时注意 Lombok 生成的 equals/hashCode/toString 方法,确保不会引发业务或性能问题。

  3. IDE/CI 环境统一
    确保所有开发成员的 IDE 都安装 Lombok 插件,CI/CD 构建环境也需支持 Lombok。

  4. 文档注释补充
    Lombok 生成的方法没有 Javadoc,重要方法建议手动补充注释。

  5. 与第三方库兼容性测试
    Lombok 有时与 MapStruct、Jackson 等库有兼容性问题,建议提前测试。


15. Lombok 代码可读性建议

  • 不要在同一个类上堆砌过多 Lombok 注解,建议拆分使用,提高可读性。
  • 对于公共 API 或对外暴露的接口,建议手写关键方法,保证可维护性。
  • 对于 equals/hashCode,务必确认业务字段是否合理参与比较。

16. Lombok 常见坑及解决方案

16.1 构造器注入与 @RequiredArgsConstructor

与 Spring 配合时,推荐使用 @RequiredArgsConstructor 进行构造器注入,避免字段未赋值。

@Service
@RequiredArgsConstructor
public class UserService {
    private final UserRepository userRepository;
}

16.2 @Data 引发的懒加载异常

JPA 实体类用 @Data 可能导致懒加载异常,建议只用 @Getter/@Setter

16.3 Lombok 与序列化冲突

如需自定义序列化逻辑,建议手写构造器、getter/setter。


17. Lombok 的替代方案

  • AutoValue:Google 推出的不可变对象生成工具,适合不可变数据类。
  • Immutables:支持更复杂的不可变对象建模。
  • MapStruct:专注于 Bean 映射,部分功能与 Lombok 重叠。

18. Lombok 未来趋势与社区建议

  • Lombok 仍在持续更新,建议关注官方版本升级。
  • 未来 Java 可能原生支持部分 Lombok 功能(如 record),可根据项目实际需求选型。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猩火燎猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值