@Builder生成的构建器不能直接用new创建实例,因其默认生成静态内部类Builder且不提供无参构造,须调用静态工厂方法builder();嵌套构建需手动build子对象;自定义builder类名需避免冲突;@Builder.Default在每次build时求值;IDE需启用注解处理,且不支持继承。

为什么 @Builder 生成的构建器不能直接用 new 创建实例
因为 @Builder 默认生成的是静态内部类 Builder,它不暴露无参构造函数,也不允许你绕过字段校验直接 new。常见错误是写 new Person.Builder() 报错 —— 实际上得调用静态工厂方法 Person.builder()。
实操建议:
-
@Builder必须加在类上,且类不能有private无参构造(否则 Lombok 会跳过生成) - 如果类已有自定义构造函数,Lombok 默认不生成全参构造;需显式加
@AllArgsConstructor或@RequiredArgsConstructor配合使用 - 字段为
final或带@NonNull时,build()会在运行时校验,空值抛NullPointerException,不是编译期报错
嵌套对象怎么用 @Builder 链式构建
当一个类包含另一个也用了 @Builder 的类时,Lombok 默认不自动支持嵌套构建,比如 Address.builder().city("Beijing").build() 不能直接塞进 Person.builder().address(???) 里 —— 你得手动 build 出子对象。
实操建议:
- 对嵌套字段加
@Singular(用于集合)或保持默认即可,但别指望链式穿透到下一层 - 想真正链式嵌套,得用
@Builder.Default配合自定义 builder 方法,或改用@Builder(builderMethodName = "customBuilder")手动控制 - 更稳妥的做法:先构建子对象,再传入父对象 builder,例如
personBuilder.address(addressBuilder.build()).build()
@Builder 和 @Builder(builderClassName = "...") 的兼容性坑
有些老项目用了自定义 builder 类名,结果升级 Lombok 后编译失败 —— 原因是新版本对 builder 类名冲突更敏感,尤其当类里已有同名静态内部类时,会直接报错 Duplicate class。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
实操建议:
- 避免手动声明
public static class Builder { ... },Lombok 会拒绝生成 - 若必须重命名 builder 类,确保类中没有同名类型、且 IDE 缓存已清(IntelliJ 常因缓存导致误报)
- Maven 中 Lombok 版本低于 1.18.20 时,
builderClassName对泛型类支持不稳定,建议升到 1.18.30+
构建器里字段顺序和 @Builder.Default 的执行时机
字段初始化顺序不是按代码顺序,而是按 build() 调用时 setter 的调用顺序;@Builder.Default 的表达式在每次 build() 时才求值,不是类加载时。
实操建议:
- 不要在
@Builder.Default里放有副作用的逻辑(如new Date()没问题,但System.out.println()会每次 build 都触发) - 如果字段依赖其他字段值(比如
fullName由firstName和lastName拼接),@Builder本身不支持推导,得靠自定义build()方法或构建后处理 - IDEA 中开启 “Enable annotation processing” 是前提,否则
builder()方法不提示、也不编译通过
最常被忽略的是:@Builder 不处理继承关系。父类加了注解,子类不会自动获得 builder 方法,必须各自标注,或者用 @SuperBuilder 替代 —— 但后者对构造逻辑和泛型的支持更复杂,别轻易切。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










