Lombok @Builder 注解:流畅的构建者模式

更新时间 2023-07-29 13:23:58

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 50w+ 字,讲解图 2200+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1700+ 小伙伴加入学习 ,欢迎点击围观

在构建复杂对象或者需要多个参数来构造对象的情况下,Builder 模式是一个非常有用的设计模式。然而,手动实现 Builder 模式可能会变得极其繁琐。幸运的是,Lombok 提供了一个非常强大的工具——@Builder 注解,可以帮助我们自动生成 builder 代码。

在本小节中,我们将会探讨如何使用 Lombok 的 @Builder 注解。

1. 什么是 Builder 模式

Builder 设计模式是一种创建型设计模式,主要解决了一些对象的构造过程中的问题。它提供了一种链式方法来创建一个复杂的对象。

2. Lombok @Builder 注解

Lombok 提供了 @Builder 注解,可以帮助我们简化 builder 模式的实现过程

例如,考虑一个 User 类,包含 name、age 和 email 这三个字段。如果我们希望通过 Builder 模式创建 User 对象,那么可以这样做:

import lombok.Builder;
import lombok.ToString;

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

然后,我们可以通过下面的方式来创建 User 对象:

User user = User.builder()
    .name("Tom")
    .age(25)
    .email("tom@example.com")
    .build();

System.out.println(user);

这段代码会输出:User(name=Tom, age=25, email=tom@example.com )

从上面的例子可以看出,Lombok 生成了一个名为 builder 的静态方法,以及 name,age 和 email 的链式设置方法,最后通过 build 方法来构建 User 对象。

3. 使用 @Builder 在构造函数上

有时候,我们可能想要在构造函数上使用 @Builder 注解,这样我们就可以控制哪些字段需要在 builder 中出现。比如,我们可能有一个包含很多字段的类,但只希望部分字段可以通过 builder 来设置:

import lombok.Builder;
import lombok.ToString;

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

    @Builder
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

在上面的例子中,email 字段不会出现在 builder 中,我们只能设置 name 和 age。

4. Builder 模式与默认值

如果我们希望某些字段在 builder 模式中有默认值,我们可以在构造函数中设置:

import lombok.Builder;
import lombok.ToString;

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

    @Builder
    public User(String name, int age) {
        this.name = name;
        this.age = age;
        this.email = "default@example.com";
    }
}

这样,除非我们在 builder 中显式地设置 email,否则 email 的值将默认为 "default@example.com "。

5. Builder 模式与 null 值

如果我们不想为某个字段设置值,那么这个字段的值就会默认为 null。例如,如果我们没有设置 email 的值,那么 email 的值就会是 null。

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

System.out.println(user);

这段代码会输出:User(name=Tom, age=25, email=null)

在使用 builder 模式时,这是一个需要注意的地方,因为 null 值可能会引发 NullPointerException。

6. 总结

本小节中,我们了解了如何使用 Lombok 的 @Builder 注解,以及在使用中可能遇到的一些情况。Lombok 的 @Builder 注解是一个非常强大的工具,可以帮助我们简化 builder 模式的实现,从而使代码更加简洁,提高开发效率。

在使用的过程中,我们需要注意一些细节,比如默认值和 null 值的处理,以及在构造函数上使用 @Builder 注解来控制哪些字段需要在 builder 中出现。