参考
https://juejin.im/post/6844903862600466439

注意⚠️:
带有@Builder的类,如果加了@NoArgsConstructor,那么也必须加@AllArgsConstructor,因为@Builder需要全参数的构造函数。

1、重叠构造函数的优化

对Effective Java书中第二章第二条遇到多个构造器参数时要考虑使用构建器进行复盘

假设某个类,现在有3个必选属性,有5个可选属性.(为了代码简洁,后面都只写一个必选属性,2个可选属性.懂就行).

那么现在想提供完善的创建该类的机制,该怎么办呢?

1、首先是方法1-使用重叠的构造方法.

这是大家都熟悉的方法,重载很多个构造方法,每个的参数都不一样,总有一款适合您!

public class Student {// 必选String name;// 可选int age;String title;public Student(String name) {this.name = name;}public Student(String name, int age) {this.name = name;this.age = age;}public Student(String name, int age, String title) {this.name = name;this.age = age;this.title = title;}
}

三个构造方法是不是已经脑壳疼了,注意,在真正的代码中,30个属性的类也不少见噢,写死人了要.
而且这样还有一个缺点,可读性太差了,在写的时候还好一些,在调用的时候你会看到编译器提醒你有30个构造方法可以调用,并且只显示参数类型不显示参数名字(比如一个8个int参数的构造方法,鬼知道应该按照什么顺序传入啊),你根本不知道该怎么用…

2、那么还有第二种方法:javabean,即使用setter.

对每个属性都提供set方法,这样客户端可以队医的调用set方法来传入他们想要的参数.

public class Student {// 必选private String name;// 可选private int age;private String title;public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public void setTitle(String title) {this.title = title;}
}

调用代码:

        Student student = new Student();student.setName("huyan");student.setAge(1);student.setTitle("666");

这样子的好处是可读性好,但是不好的地方是不安全,你根本不知道客户端会以什么奇怪的方式使用你的类.

3、可以使用Builder模式.

public class Student {// 必选private String name;// 可选private int age;private String title;private static class Builder {// 必选private String name;// 可选private int age;private String title;public Builder(String name) {this.name = name;}public Builder age(int age) {this.age = age;return this;}public Builder title(String s) {this.title = s;return this;}public Student build() {return new Student(this);}}private Student(Builder builder) {name = builder.name;age = builder.age;title = builder.title;}

这里面有几个重要的点:

  • 将Student类的构造方法私有化,所以想要新建Student必须使用Builder.
  • Builder只有一个构造方法,传入必选的参数,这样可以保证每个Student都会有必选参数.
  • 对所有的可选参数提供同名方法,使得可选参数可以被设置,同时返回自身.
  • Builder提供build方法,调用Student私有的构造方法,返回对象.

客户端的调用方法如下:

    public static void main(String[] args) {Student s = new Builder("huyan").age(11).title("888").build();}

使用Builder模式实现了上面其他两种方式的优点:安全且可读性高.

  • 限制了参数,保证必选参数肯定有.
  • 可读性好,传入每个可选参数单独调用方法,可以明确的知道每个参数的意义.
  • 链式调用看起来好看.

当然,builder模式也有缺点:

  • 在创建的过程中多创建了一个对象,这对性能肯定是有影响的,所以在极限要求性能的场景可以注意一下.
  • 代码比重叠构造器的代码都多…写起来也挺累啊.

等等,老是写Builder类?lombok了解一下?只需要一个注解就可以实现上面这样子的效果噢~.所以接下来学习一下,lombok是都有哪些使用方式.

2、lombok

lombok是一套小工具,可以帮助你减少样板式或者实现一些别的功能.

lombok的作用仅在源码起作用,也就是说,lombok会帮你在编译的过程中添加一些东西,使得你不用自己写,而一旦生成了class文件,lombok的作用就已经结束.

Builder:首先看一下上面提到的Builder是怎么实现的.将Student类的代码清空,仅保留属性,然后在类名上加上@Builder注解:

@Builder
public class Student1 {// 必选private String name;// 可选private int age;private String title;}

然后使用IDEA进行编译,然后查看class文件,Idea会自动帮我们反编译拿到源文件.查看源代码,如下:

public class Student1 {private String name;private int age;private String title;@ConstructorProperties({"name", "age", "title"})Student1(String name, int age, String title) {this.name = name;this.age = age;this.title = title;}public static Student1.Student1Builder builder() {return new Student1.Student1Builder();}public static class Student1Builder {private String name;private int age;private String title;Student1Builder() {}public Student1.Student1Builder name(String name) {this.name = name;return this;}public Student1.Student1Builder age(int age) {this.age = age;return this;}public Student1.Student1Builder title(String title) {this.title = title;return this;}public Student1 build() {return new Student1(this.name, this.age, this.title);}public String toString() {return "Student1.Student1Builder(name=" + this.name + ", age=" + this.age + ", title=" + this.title + ")";}}
}

可以看到,Builder的代码和上面我们自己写的一模一样,整个类的区别就是,Student1类提供了toBuilder()方法,返回一个Student1Builder,可以完全屏蔽用户对Builder类的感知.

下面列举一些常用的lombok的注解,并简要解释其作用.

  • @Getter/@Setter
    可以应用在类上,属性上. 自动生成get/set方法.
  • @toString
    自动生成toString方法.
  • @EqualsAndHashCode
    生成equals和hashcode方法.
  • @RequiredArgsConstructor
    生成一个必须参数的构造器.
  • @Data
    快捷方法,相当于@Getter+ @Setter+ toString + EqualsAndHashCode + RequiredArgsConstructor.
  • @AllArgsConstructor 和 @NoArgsConstructor
    自动生成全部参数和零个参数的构造方法.
  • @Log
    包含一系列常用的log系统的注解,比如@Slf4j,@Log4j2等,自动生成一个全局final的logger供你使用.

构建器builder模式 + lombok @Builder的介绍及使用相关推荐

  1. 动态表单构建器——建造者模式

    在编写一个弹出框时,它可以包含确定按钮,取消按钮,标题栏,关闭按钮,最小化按钮,内容,最大化按钮等内容,但这些内容在不同的需求下又不是必须存在的,不同的需求需要对这些组件自由组合,显然每次组合都要重复 ...

  2. 火遍全网的Hutool,如何使用Builder模式构建线程池

    前言 Builder 设计模式也叫做 构建者模式或者建造者模式,名字只是一种叫法,当聊起三种名称的时候知道是怎么回事就行 Builder 设计模式在作者编码过程中,属于比较常用的模式之一.优秀的设计模 ...

  3. 设计模式系列-Builder模式(高效构建参数)

    引言 在Java编程中,常常需要为一个Bean构建成员变量或者构建参数,常用的方法有使用构造函数.使用JavaBean的set()方法,但是这两个方案或多或少都存在一定的缺点,于是今天的主角build ...

  4. 同事写了一个疯狂的类构造器,我要疯了,Builder 模式都不会么?!!

    疯狂的类构造器 最近栈长在做 Code Review 时,发现一段创建对象的方法: Task task = new Task(112, "紧急任务", "处理一下这个任务 ...

  5. 【设计模式】Builder模式

    一.前言 设计模式系列(参考资料:<Android源码设计模式解析与实战>--何红辉.关爱明) 单例模式 Builder模式 原型模式 二.介绍 我们开发中偶尔会遇到一些需要设置10个或以 ...

  6. Java 设计模式之Builder模式

    设计模式系列 创建型设计模式 Java 设计模式之单例模式 Java 设计模式之静态工厂方法模式 Java 设计模式之工厂方法模式 Java 设计模式之抽象工厂模式 Java 设计模式之Builder ...

  7. 【Android 高性能音频】AAudio 音频流 构建器 ( AAudio.h | 流构造器 | 音频设备配置 | 音频采样配置 | 构建器销毁 )

    文章目录 I . AAudio 音频流创建流程 II . AAudio 音频流构建器 III . AAudio 音频流构建器 代码示例 IV . AAudio 音频流构建器创建方法 AAudio_cr ...

  8. JAVA构造对象的几种方式(构建器、构造器)

    大家好,我是烤鸭: 今天说一下初始化对象的几种方式:   1.    多参数构造器 2.    构建器  3.    构造器后 + get/set方法 举个例子: 这里有个机构entity,提供一个默 ...

  9. 【Effective Java】第二章:静态工厂、构建器、强化Singleton属性、私有构造器、

    文章目录 一. 用静态工厂方法代替构造器 优势: 劣势: 实例代码: 二. 遇到多个构造器参数时要考虑使用构建器 ① 重叠构建器 ② JavaBeans模式 ③ Builder模式 三. 用私有构造器 ...

最新文章

  1. iPhone How-to:如何调整UIView的Z-Order
  2. 零基础入门学python 第二版-《零基础入门学习Python》第二版和第一版的区别在哪里呢?...
  3. liunx 安装 zookeeper(转)
  4. 6.exit _exit _Exit
  5. 互联网亿级日志实时分析平台,一个码农半小时就可以搞定,只因ELK
  6. 51nod 1344 走格子【贪心/前缀和】
  7. 我的SAP Hybris学习笔记
  8. android9 前台服务通知_Android通知概览
  9. Java版 数字金额大写转换
  10. HDU2022 海选女主角【入门】
  11. 自动化测试的点点滴滴经验积累
  12. 安装SVN及安装语言包
  13. 【触动精灵将图片转成base64字符串后通过post方式上传给服务器】
  14. 安卓psp模拟器哪个好_手机psp模拟器哪个好_安卓PSP模拟器中文官方版下载_66游戏网...
  15. 很实用的应用,推荐一下http://static.apk.hiapk.com/html/2012/06/625213.html?module=256info=MQA2ADMA
  16. Python 基础 --- 变量类型
  17. 中国Azure新数据中心(区域)正式商用
  18. 建筑结构抗震分析之施加地震波的方法与理论机理
  19. 【Python Sympy】将表达式化为关于x的多项式,求出多项式系数
  20. module ‘selenium.webdriver‘ has no attribute ‘PhantomJS‘

热门文章

  1. 计算机网络中数据包的分布,计算机网络习题
  2. vue向后端发送数据并得到返回值
  3. win32 透明窗口无边框模版
  4. 有关javabean的说法不正确的是_关于JavaBean,下列的叙述哪一项是不正确的?( )...
  5. EPICS记录参考--模拟输入记录(ai)
  6. java键盘监听延迟_解决JAVA键盘监听的延迟现象以及八个方向的运动
  7. 搭建直播平台过程中的全能“辅助”——流媒体服务器...
  8. 办公大师系列经典丛书 诚聘译者
  9. 一招教你如何提高分销平台分账效率
  10. AI 隐身术,让你在视频中消失的“黑魔法”,想拥有吗?