Lombok @Builder 注解:流畅的构建者模式
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
截止目前, 星球 内专栏累计输出 66w+ 字,讲解图 2896+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2300+ 小伙伴加入学习 ,欢迎点击围观
Lombok 的 @Builder
注解用于生成建造者(Builder)模式的代码。Builder 模式提供了一种灵活、易读的方式来创建复杂对象,尤其适合需要设置多个可选参数、支持链式调用的场景。@Builder
注解自动生成了静态内部类 Builder 及其相关方法,使代码更加简洁、清晰。
基本用法
使用 @Builder
注解,Lombok 会自动生成一个静态的内部 Builder 类,包含所有字段的 “链式” setter
方法,并生成一个 build()
方法用于创建对象实例。
示例
import lombok.Builder;
@Builder
public class User {
private String name;
private int age;
private String email;
}
上面的代码将自动生成一个 User
类的 Builder,允许使用链式方法来设置字段,并通过 build()
方法完成对象的创建,比如像下面这样:
User user = User.builder()
.name("Alice")
.age(25)
.email("alice@example.com")
.build();
生成的代码可以方便地指定所需字段,从而避免长参数列表的问题,代码也更具可读性。
@Builder
的常用参数
builderMethodName
通过设置 builderMethodName
,可以自定义生成的静态 Builder 方法名称。默认情况下,此方法名为 builder()
。
@Builder(builderMethodName = "newUser")
public class User {
private String name;
private int age;
}
现在可以使用 User.newUser()
来获取一个 Builder 实例:
User user = User.newUser().name("Bob").age(30).build();
buildMethodName
buildMethodName
用于自定义生成的构建方法的名称,默认为 build()
。可根据需求自定义为其他名称。
@Builder(buildMethodName = "create")
public class User {
private String name;
private int age;
}
生成的 Builder 实例可以调用 create()
方法来构建 User
对象:
User user = User.builder().name("Charlie").age(40).create();
toBuilder
toBuilder
参数允许在已有对象的基础上创建一个新的 Builder。它会为生成的类添加 toBuilder()
方法,返回一个带有当前对象状态的 Builder,便于在已有对象的基础上做出小幅修改。
import lombok.Builder;
@Builder(toBuilder = true)
public class User {
private String name;
private int age;
}
可以使用 toBuilder()
方法生成一个新的 Builder,并修改部分字段:
User originalUser = User.builder().name("David").age(20).build();
User updatedUser = originalUser.toBuilder().age(25).build();
在上面的例子中,updatedUser
基于 originalUser
创建,但修改了 age
字段。
@Builder
和构造器的结合
@Builder
注解可以与 @AllArgsConstructor
、@NoArgsConstructor
等 Lombok 注解结合使用,用于支持构造器的初始化。这对字段较多且需要构造方法和 Builder 的场景尤其适用。
import lombok.Builder;
import lombok.AllArgsConstructor;
@Builder
@AllArgsConstructor
public class User {
private String name;
private int age;
}
通过这种方式,可以在类中同时拥有构造方法和 Builder。
使用 @Builder.Default
指定默认值
@Builder
默认不会使用字段的初始值。如果希望 Builder 生成的对象包含默认值,可以使用 @Builder.Default
注解指定。
import lombok.Builder;
import lombok.Builder.Default;
@Builder
public class User {
private String name;
@Default
private int age = 18;
}
使用 @Builder.Default
后,未在 Builder 中设置 age
的情况下,age
将默认为 18。
User user = User.builder().name("Eve").build(); // age 默认为 18
小结
Lombok 的 @Builder
注解通过自动生成 Builder 模式的代码,使得对象创建过程更为清晰、灵活。主要特点包括:
- 生成链式 setter 方法和
build()
方法,支持流畅的对象创建方式。 - 提供
builderMethodName
、buildMethodName
等参数,支持自定义。 toBuilder
参数允许基于现有对象轻松创建新的 Builder。@Builder.Default
支持设置默认值。
通过使用 @Builder
注解,可以减少样板代码,提升代码的可读性和维护性。