java构造者模式_Lombok的Builder与构造者模式

news/2024/7/7 16:59:26

1. 简介

在Lombok初遇,我们简单的介绍了一下Lombok的使用。

其中有一个@Builder注解,这个注解和构造者模式有什么关系呢?

2. 构造者模式

建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,建造者模式是一种对象创建型模式。

抽象建造者(Builder): 是一个抽象接口,为了创建一个产品对象的各个部件 ,主要是创建组件createXX,和获取最终复杂对象getProduct

实际的建造者(ConcreteBuilder):实现Builder接口,实现各个部件的建造方法,返回创建好的复杂对象

实际产品(Product):要生成的复杂对象类,包含多个部件

指挥者(Director):负责控制Builder生产部件的顺序

类图,大概是下面这个样子:

4c37c844945d7cd01bebe6d53757ffc3.png

3. Lombok Builder

构造模式更像是学院派的东西,实际上更常使用的是Lombok Builder的这种模式:

通过一个public static class Builder的内部类,持有要构建对象的所有属性

设置属性的方法都返回Builder当前实例this,这样可以流式设置属性,用起来更加方便

提供一个static的Builder方法,方便用户获取Builder对象

用户通过builder对象自定义设置属性

提供build方法,创建最终对象

不仅Lombok这么玩,很多第三方库都这么玩,如:Spring、Mybatis、Curator

下面我们看一下Lombok的Builder到底生成了什么代码,首先看实体类:

import lombok.Builder;

@Builder

public class User {

private Integer id;

private String name;

private Integer age;

private String sex;

}

使用delombok查看一下生成的User类:

java -jar lombok.jar delombok -p E:\workspace\capital\data-learn\src\main\java\vip\mycollege\lombok\User.java

生成的User类:

public class User {

private Integer id;

private String name;

private Integer age;

private String sex;

@java.lang.SuppressWarnings("all")

User(final Integer id, final String name, final Integer age, final String sex) {

this.id = id;

this.name = name;

this.age = age;

this.sex = sex;

}

@java.lang.SuppressWarnings("all")

public static class UserBuilder {

@java.lang.SuppressWarnings("all")

private Integer id;

@java.lang.SuppressWarnings("all")

private String name;

@java.lang.SuppressWarnings("all")

private Integer age;

@java.lang.SuppressWarnings("all")

private String sex;

@java.lang.SuppressWarnings("all")

UserBuilder() {

}

@java.lang.SuppressWarnings("all")

public User.UserBuilder id(final Integer id) {

this.id = id;

return this;

}

@java.lang.SuppressWarnings("all")

public User.UserBuilder name(final String name) {

this.name = name;

return this;

}

@java.lang.SuppressWarnings("all")

public User.UserBuilder age(final Integer age) {

this.age = age;

return this;

}

@java.lang.SuppressWarnings("all")

public User.UserBuilder sex(final String sex) {

this.sex = sex;

return this;

}

@java.lang.SuppressWarnings("all")

public User build() {

return new User(this.id, this.name, this.age, this.sex);

}

@java.lang.Override

@java.lang.SuppressWarnings("all")

public java.lang.String toString() {

return "User.UserBuilder(id=" + this.id + ", name=" + this.name + ", age=" + this.age + ", sex=" + this.sex + ")";

}

}

@java.lang.SuppressWarnings("all")

public static User.UserBuilder builder() {

return new User.UserBuilder();

}

}

这样使用起来就非常方便了:

User user = User.builder().id(1).age(20).sex("male").name("tim").build();

不用通过一个setter方法,一个setter方法去调用。

4. Lombok @Builder.Default

如果有默认值该怎么办?

例如,sex默认是unkonwn:

private String sex = "unkonwn";

@Builder.Default

private String sex = "unkonwn";


http://www.niftyadmin.cn/n/2745920.html

相关文章

记录: Android测试网速实现

2.3开始android提供了一个流量统计类, android.net.TrafficStats,通过使用这个类提供的方法,就可以获取设备流量。下面为该类中的常用方法,欢迎大家完善补充 static long getMobileRxBytes() //获取通过Mobile连接收到的字节总数&…

Spring AOP原理

ProxyFacotryBean是FacotryBean的一种实现,FacotryBean要产生bean都要重写getObject方法,而ProxyFacotryBean这里的这个getObject正是为代理做了准备并返回代理对象。首先用initializeAdvisorChain(第一次去取代理对象时初始化一遍)初始化Advisor链后对于singleton和…

mysql insert优化_MySql的insert语句的性能优化方案

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼下面是数据库方面调优的一个小例子,你也完全可以通过掌握基础知识,完成简单的sql语句级别的性能调优。很专注自动化测试,性能测试,安全性测试,移动端的自动化测试的人员培…

Android4.4 及以下TextView,Button等控件使用矢量图报错

2019独角兽企业重金招聘Python工程师标准>>> 1 问题描述 最近项目开发中,图标资源我尽量使用了矢量图,然而配置了基本的兼容设置,程序在低版本中运行还是出现了问题。 xml布局文件中,在TextView中使用矢量图&#xff0…

tomcat怎么运行java_如何在tomcat启动的时候运行一个Java类

设置个Listener就好了,在web.xml中指定描述。web.xml其实就是tomcat启动的时候会读取的一个描述文件,比如访问服务器的时候首页等都可以在里面指定,有相应的tag。这里有解释:http://blog.chinaunix.net/uid-20399471-id-1687965.h…

038:自定义过滤器实战

自定义时间计算过滤器: 有时候经常会在朋友圈、微博中可以看到一条信息发表的时间,并不是具体的时间,而是距离现在多久。比如 刚刚 , 1分钟前 等。这个功能 DTL 是没有内置这样的过滤器的,因此我们可以自定义一个这样的…

【Linux】进程信号之信号的产生

进程信号 一 一、信号入门1、信号的一些特性2、信号的处理方式信号捕捉初识 3、Linux下的信号 二、信号的产生1、通过终端按键产生信号2、调用系统函数向进程发信号a、kill函数b、raise函数c、abort函数 3. 由软件条件产生信号4、硬件异常产生信号 结语 一、信号入门 什么是信号…

python axis client_Python Matplotlib.axis.Axis.get_majorticklocs()用法及代码示例

Matplotlib是Python中的一个库,它是数字的-NumPy库的数学扩展。它是Python中令人惊叹的可视化库,用于数组的2D图,并用于与更广泛的SciPy堆栈配合使用。matplotlib.axis.Axis.get_majorticklocs()功能matplotlib库的轴模块中的Axis.get_majort…