构造函数有多个参数时要考虑使用Builder

简介: 假设一个类的构造函数有多个参数时,如果想要创建实例时,很可能就会写出这样的代码:

多参数构造函数:


假设一个类的构造函数有多个参数时,如果想要创建实例时,很可能就会写出这样的代码:


NutritionFacts cocaCola = new NutritionFacts(240, 8, 100, 0, 35, 27);


这个调用通常需要许多你根本不想设置的参数,但却不得不设置,比如第三个传入的0。这种方式是可行的,但如果有很多参数的时候,客户端代码会很难编写,程序员会因为要避免传错参而小心翼翼。


记得之前在公司里面用了其他人封装的日志工具类LogUtil,里面的构造函数就是这样的风格~~,不仅传的参数多,还提供了各种各样不同参数组合的构造函数,最后当然逃不过被重写的命运 : )


JavaBeans模式:


NutritionFacts cocaCola = new NutritionFacts();
cocaCola.setServingSize(240);
cocaCola.setServings(8);
cocaCola.setCalories(100);
cocaCola.setSodium(35);
cocaCola.setCarbohydrate(27);


这种模式下先调用无参构造器创建对象,再调用setter方法来设置每个必要的参数,这样的代码可读性要更高,但却有严重的缺点:


创建对象的过程不是原子的,于是在高并发场景下可能产生不一致的对象

JavaBeans模式无法将类做成不可变的,因为调用了setter方法本身就意味着“可变”了


建造者(Builder)模式:


Mybatis中的SqlSessionFactoryBuilder就是建造者模式的体现,在类的定义里面,builder通常是类的静态成员类,并且调用无参的build方法生成的通常是不可变的对象,使用示例:


NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).carbohydrate(27).build();

Builder模式十分灵活,可以利用单个builder构建多个对象;builder的参数可以在调用build方法来创建对象期间进行调整,甚至可以填充某些域,比如创建新对象是自动增加序号值。


相关文章
|
4月前
|
存储 C#
C# 方法详解:定义、调用、参数、默认值、返回值、命名参数、方法重载全解析
方法是一段代码,只有在调用时才会运行。 您可以将数据(称为参数)传递给方法。 方法用于执行某些操作,也被称为函数。 为什么使用方法?为了重用代码:定义一次代码,然后多次使用。
66 0
通过构造方法使属性初始化
通过构造方法使属性初始化
101 0
|
Python
python调用父类方法的三种方式(super调用和父类名调用)
python调用父类方法的三种方式(super调用和父类名调用)
217 0
|
C# Docker 容器
C#方法与参数 常见命名空间汇总 using的使用main方法参数
C#方法与参数 常见命名空间汇总 using的使用main方法参数
137 0
C#方法与参数 常见命名空间汇总 using的使用main方法参数
|
编译器 C++
C++关于参数是对象时要调用拷贝构造函数进行传参的问题探讨
C++关于参数是对象时要调用拷贝构造函数进行传参的问题探讨
257 0
|
编译器 C++
C++类中默认生成的函数
C++类中默认生成的函数
163 0
|
Java
【Groovy】循环控制 ( Java 语法循环 | 默认的 IntRange 构造函数 | 可设置翻转属性的 IntRange 构造函数 | 可设置是否包含 to 的构造函数 | 0..9 简写 )(一)
【Groovy】循环控制 ( Java 语法循环 | 默认的 IntRange 构造函数 | 可设置翻转属性的 IntRange 构造函数 | 可设置是否包含 to 的构造函数 | 0..9 简写 )(一)
148 0
|
Java
【Groovy】循环控制 ( Java 语法循环 | 默认的 IntRange 构造函数 | 可设置翻转属性的 IntRange 构造函数 | 可设置是否包含 to 的构造函数 | 0..9 简写 )(二·)
【Groovy】循环控制 ( Java 语法循环 | 默认的 IntRange 构造函数 | 可设置翻转属性的 IntRange 构造函数 | 可设置是否包含 to 的构造函数 | 0..9 简写 )(二)
140 0
|
Kotlin
【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )(一)
【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )(一)
270 0