Lombok Builder 构建器做了哪些事情?

本文介绍了 Lombok 的 @Builder 注解如何简化 Java Bean 的构建过程,详细讲解了 Builder 模式的作用和使用场景。通过示例展示了 Lombok 如何生成构建器,并分析了其内部机制,包括反编译后的源码分析,解释了属性默认值问题及解决方案。此外,还讨论了何时应该使用构建器模式以及 Lombok 的适用场景。
摘要由CSDN通过智能技术生成

作者 | 李增光


640?wx_fmt=jpeg

杏仁后端工程师。只有变秃,才能变强!

记得之前,我在《effective java》上看过 Builder 构建器相关的内容,但实际开发中不经常用。后来,在项目中使用了 lombok ,发现它有一个注解 @Builder,就是为 java bean 生成一个构建器。于是,回头重新复习了下相关知识,整理如下。

0.何为 Builder 模式 ?

Builder 模式 又被称作 建造者模式 或者 生成器模式.是一种设计模式。

维基百科上的定义为:

将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

一个典型的 Builder 模式的 UML 类图如下:

640?wx_fmt=png

角色介绍:

  • Product 产品类 : 产品的抽象类。

  • Builder : 抽象类, 规范产品的组建,一般是由子类实现具体的组件过程。

  • ConcreteBuilder : 具体的构建器。

  • Director : 统一组装过程(可省略)。

注意与抽象工厂模式的区别: 抽象工厂模式与生成器相似,因为它也可以创建复杂对象.主要的区别是生成器模式着重于一步步构造一个复杂对象.而抽象工厂模式着重于多个系列的产品对象(简单的或是复杂的).生成器在最后的一步返回产品,而对于抽象工厂来说,产品是立即返回的。

1. 为什么使用构建器模式 ?

若一个类具有大量的成员变量,我们就需要提供一个全参的构造器或大量的 set 方法.这让实例的创建和赋值,变得很麻烦,且不直观.我们通过构建器,可以让变量的赋值变成链式调用,而且调用的方法名对应着成员变量的名称.让对象的创建和赋值都变得很简洁、直观。

Builder 模式的使用场景:

  • 相同的方法,不同的执行顺序,产生不同的事件结果时。

  • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。

  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。

  • 当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时。

2. lombok Builder使用样例

借助于 Lombok 我们可以快速创建 Builder 模式。首先,创建一个名为 User 的 Java Bean,非常简单,只有两个属性,sex,和 name。其中 @Builder可以自动为 User 对象生成一个构建器,@ToString 可以自动为 User 对象生成 toStrng()方法。

@Builder
@ToString
public class User {
private Integer sex;
private String name;

}

现来测试一下 Lombok 为我们自动提供的构建器功能:

    @Test
public void builderTest() {
User user = User.builder()
.name("杏仁")
.sex(1)
.build();
System.out.println(user.toString());
}

会看到控制台打印:

User(sex=1name=杏仁)

可以看到,打印结果就是我们想要的样子,但是 Lombok 为我们做了什么事情呢?

使用 Lombok 需要注意理解 Lombok 的注解做了什么,否则很容易出错。

3. 反编译 Lombok 生成的 User.class

*注意:下面请区分两组名词:"builder方法"和“build方法”,“构造器”和“构建器”。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值