学习总结:java构建器模式

本文探讨了在Java中处理有大量可选参数对象构造的挑战,对比了重叠构造器和javaBeans模式的优缺点。重叠构造器导致过多的构造函数,而JavaBeans模式则可能导致对象在构建过程中出现不一致状态。为了解决这些问题,文章介绍了Java构建器模式,通过使用Builder类,先用必要参数调用构造器,然后通过setter方法设置可选参数,最后通过无参的build方法生成不可变对象。这种方法既保持了代码的整洁,又确保了对象构建的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何构造有大量可选参数的对象?


重叠构造器:可行,但构造函数太多,代码很难编写,切难以阅读。


javaBeans模式(调用一个无参构造器创建对象,调用setter方法设置每个参数):弥补重叠构造器的不足,但是构造时会产生不一致的状态(一个只设置了A属性,另一个只设置了B属性,不能确定必选参数都设置了),造成调试困难;并且把类变成可变的,设置一个属性后,还能再设置一遍来改变原属性。


Java构建器:不直接生成想要的对象,利用必要的参数调用构造器,得到builder对象,在builder对象上调用类似setter方法,设置每个可选参数,最后,调用无参的build方法生成不可变的对象,这个build是它构建的类的静态成员类。

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{
		private final int servingSize;
		private final int servings;
		
		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;
		}
		/*
		 * 调用类似setter方法,设置每个可选参数
		 */
		public Builder calories(int cal){
			calories=cal;
			return this;
		}
		public Builder fat(int fa){
			fat=fa;
			return this;
		}
		public Builder sodium(int so){
			sodium=so;
			return this;
		}
		public Builder carbohydrate(int car){
			carbohydrate=car;
			return this;
		}
		/*
		 * 生成不可变对象
		 */
		public NutritionFacts build(){
			return new NutritionFacts(this);
		}
	}
	
	private NutritionFacts(Builder builder){
		servingSize=builder.servingSize;
		servings=builder.servings;
		calories=builder.calories;
		fat=builder.fat;
		sodium=builder.sodium;
		carbohydrate=builder.carbohydrate;
	}
}
调用方法:

NutritionFacts nur=new NutritionFacts.Builder(7,12).calories(5).fat(9).sodium(23).carbohydrate(88).build();


android 中 okhttp 的Request方法类似。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值