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() 方法,支持流畅的对象创建方式。
  • 提供 builderMethodNamebuildMethodName 等参数,支持自定义。
  • toBuilder 参数允许基于现有对象轻松创建新的 Builder。
  • @Builder.Default 支持设置默认值。

通过使用 @Builder 注解,可以减少样板代码,提升代码的可读性和维护性。