`

2. 遇到多个构造器参数时要考虑使用构建器

阅读更多

1. 重叠构造器模式的缺点:

当有许多参数时,客户端代码很难编写,并且难以阅读。

2. JavaBeans模式的缺点:

1) 构造过程被分到几个调用中,在构造过程中JavaBeans可能处于不一致的状态;类无法仅仅通过检验构造器参数的有效性来保证一致性。

2) JavaBeans模式阻止了把类做成不可变的可能,需要程序员付出额外的努力来确保线程安全。

3. Builder模式:

不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或者静态工厂),得到一个builder对象。然后客户端在builder对象上调用类似于setter的方法,来设置每个相关的可选参数。最后,客户端调用无参的builder方法来生成不可变的对象。

4. Builder模式的不足:

1) 为了创建对象,必须先创建它的构造器,在某些特别注重性能的情况下会造成问题;

2) 比重叠构造器模式更加冗长,因此只在参数很多时使用,如4个或者更多个参数。

public class NutritionFacts {

	private final int servingSize;
	private final int servings;
	private final int calories;
	private final int fat;
	private final int sodium;
	private final int carbohydrate;

	public static class Builder {

		// required parameters
		private final int servingSize;
		private final int servings;

		// optional parameters
		private int calories = 0;
		private int fat = 0;
		private int sodium = 0;
		private int carbohydrate = 0;

		public Builder(int servingSize, int servings) {
			this.servingSize = servingSize;
			this.servings = servings;
		}

		public Builder calories(int calories) {
			this.calories = calories;
			return this;
		}

		public Builder fat(int val) {
			this.fat = val;
			return this;
		}

		public Builder carbohydrate(int val) {
			this.carbohydrate = val;
			return this;
		}

		public Builder sodium(int val) {
			this.sodium = val;
			return this;
		}

		public NutritionFacts build() {
			return new NutritionFacts(this);
		}
	}

	private NutritionFacts(Builder builder) {
		this.servingSize = builder.servingSize;
		this.servings = builder.servings;
		this.calories = builder.calories;
		this.fat = builder.fat;
		this.sodium = builder.sodium;
		this.carbohydrate = builder.carbohydrate;
	}

	public static void main(final String[] args) {
		NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
				.calories(100).sodium(35).carbohydrate(27).build();
	}
}

 总之:如果类的构造器或者静态工厂方法中具有多个参数,设计这个类的时候采用builder模式是一个不错的选择。

分享到:
评论

相关推荐

    ArcPy实现等间距重分类解决模型构造器中无法使用重分类的问题

    在Esri的ArcGIS软件中,通常会使用模型构造器(Model Builder)来构建自动化的工作流程。然而,有时我们可能会遇到模型构造器不支持等间距重分类的情况,这时候,我们可以借助Python扩展库ArcPy来实现这一功能。 ...

    Effective-Java读书笔记(上)

    **遇到多个构造器参数时的考虑**: - **重叠构造器模式**:这种模式下,每个构造器提供比前一个多一个参数,但是这种模式会导致构造器过多,增加复杂度。 - **JavaBeans模式**:虽然使用无参构造器并结合setter方法...

    JAVA_API1.6文档(中文)

    javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类的服务提供者的抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API...

    oSIP协议栈(及eXoSIP、Ortp等)使用入门 (2).pdf

    2. 在编译osip2.dll时,可能遇到链接错误,因为缺少osipparser2.lib。将osipparser2.lib添加到项目目录,并在链接器设置中添加该库。 3. 成功编译后,将得到osip2.dll和osip2.lib。 配置你的项目以使用oSIP库: 1. ...

    实战应用遇到的函数共5页.pdf.zip

    14. **函数柯里化**:这是一种将接受多个参数的函数转换为一系列接受单一参数的函数的技术,常用于预先设置部分参数,简化调用过程。 以上只是一些基础和通用的函数应用知识,具体到“实战应用遇到的函数共5页.pdf....

    [Java参考文档].JDK_API 1.6

    javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类的服务提供者的抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API。...

    大数据-算法-微弱核四极矩共振信号参数估计方法研究.pdf

    通过构造Hankel矩阵并执行SVD,信号被分解为多个分量,然后利用NQR信号的先验知识过滤干扰和噪声,从而提高信噪比。在此基础上,采用MUltiple SIgnal Classification (MUSIC)谱估计配合非线性最小二乘(Nonlinear ...

    编写高效优雅Java程序.docx

    在编写高效优雅的Java程序时,我们经常遇到各种设计挑战,比如如何处理构造器参数过多的问题。在这种情况下,我们可以采用Builder模式。Builder模式是一种对象创建型设计模式,它能帮助我们构建复杂的对象,同时保持...

    Node.js-LibraCore是一个javascript库客户端可用于与libra节点交互

    Libra网络由多个节点组成,这些节点通过共识协议(如LibraBFT)共同维护区块链的状态。LibraCore库允许开发者与这些节点进行通信,执行智能合约,参与Libra生态系统。它封装了复杂的区块链协议,使得开发过程更为...

    [Java参考文档]

    javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类的服务提供者的抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API...

    JavaAPI中文chm文档 part2

    javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类的服务提供者的抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API...

    实验三 Fisher线性判别分类器.zip

    7. **评估与优化**:使用交叉验证或其他评估方法检查分类器的性能,根据结果调整模型参数或选择不同的特征。 实验三的文档可能包含了更详细的操作步骤、实例分析和代码实现。通过这个实验,你可以亲自动手实现...

    JavaAPI1.6中文chm文档 part1

    javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类的服务提供者的抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    7.3.3 让方法有多个参数 163 7.4 返回值:汽车超速了吗? 164 7.4.1 写一个有返回值的方法 164 7.4.2 调用有返回值的方法 165 7.4.3 发生了什么?如何使用方法的返回值? 166 7.4.4 使用return结束方法 166 ...

    httpclient-tutorial.pdf

    5. 异常处理:在"Exceptionhandling.."部分,讲解在使用HTTP客户端时可能遇到的异常以及如何处理它们。 1.3.1. HTTP传输安全:介绍如何保证HTTP传输过程中的安全性。 1.3.2. 幂等方法:解释幂等性在HTTP方法中的...

    java api最新7.0

    javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类的服务提供者的抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API。...

    javaoopppt

    默认构造器在没有定义其他构造器时自动生成,但也可以自定义构造器以满足特定的初始化需求。 7. 方法覆盖与重载:覆盖发生在子类中,当子类重写父类的同名方法时。方法重载则是在同一类中,通过不同的参数列表定义...

    二级CMOS放大器的电路与版图设计.pdf

    2. 手工计算电路参数:设计者需要根据理论计算和经验公式确定晶体管尺寸、电阻值等关键参数,以确保放大器在模拟时能达到预期性能。 3. 仿真、分析与参数调整:利用Mentor软件进行电路仿真,检查增益、带宽、噪声等...

    vc使用中遇到的初级问题集

    在使用Microsoft Visual C++ 6.0(简称VC6.0)进行编程时,初学者可能会遇到各种问题。以下是一些常见的问题及其解决方案,旨在帮助入门者更好地理解和解决这些问题。 1. **文件的输入输出技术**:在C++中,我们...

Global site tag (gtag.js) - Google Analytics