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

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

一则小广告

最近,小哈正在带小伙伴做前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.2 + Vite 4,手把手教学,前端 + 后端全栈开发,从 0 到 1 讲解每个功能开发过程,1v1 答疑,陪伴式直到项目上线,目前第六章 《Element Plus 手搭 Admin 后台管理骨架》已快完结,截止到目前,已更新 52 节内容,共计 81557 字,演示截图:433 张,持续更新中,后续还会上新更多项目,欢迎点击加入

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