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

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

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书活动

目前, 星球 内第2个项目《仿小红书(微服务架构)》正在更新中。第1个项目:全栈前后端分离博客项目已经完结,演示地址:http://116.62.199.48/。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 255 小节,累计 39w+ 字,讲解图:1716 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1300+ 小伙伴加入,欢迎点击围观

在构建复杂对象或者需要多个参数来构造对象的情况下,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 中出现。