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

静态工厂和构造器有个共同的局限性:他们都不能很好的扩展到大量的可选参数。

遇到多个构造器(构造方法)参数时,如何操作???

    方法一 :重叠构造器模式(可读性不好)

原理:提供一个只有必要参数的构造器,第二个构造器有一个可选参数,第三个构造器有两个可选参数,依次类推,直到最后一个构造器包含所有的可选参数。
缺点:谁作为第一个可选参数是一个问题,因为后一个包含两个可选参数的构造器必须传递值给第一个可选参数,导致需要设置许多本不想设置的参数。    

    方法二 :JavaBeans模式(安全性不好)

原理:通过一个无参构造器创建对象,然后调用setter方法来设置每个必要的参数。这样创建实例很容易,产生的代码读起来也比较容易。
缺点:因为构造过程中被划分到了几个调用中,在构造过程中JavaBean可能处于不一致的状态。类无法仅仅通过检验构造器参数的有效性来保证一致性。
简单来说就是多个字段需要调用就要执行多次setter方法进行设值,数据不能一次性完成,就可能在构造中被改变。
JavaBean模式下无法将类设置为不可变(即final类型),那么这样需要我们去确保它的线程安全。

     方法三 :Builder模式(推荐)

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

	private BuilderDemo(Builder builder) {
		this.value01 = builder.value01;
		this.value02 = builder.value02;
		this.value03 = builder.value03;
		this.value04 = builder.value04;
	}

	// 构建器
	public static class Builder {
		private String value01;
		private String value02;
		private String value03;
		private String value04;

		public Builder value01(String value01) {
			this.value01 = value01;
			return this;
		}

		public Builder value02(String value02) {
			this.value02 = value02;
			return this;
		}

		public Builder value03(String value03) {
			this.value03 = value03;
			return this;
		}

		public Builder value04(String value04) {
			this.value04 = value04;
			return this;
		}

		public BuilderDemo build() {// build方法,生成一个需要被构建的类
			return new BuilderDemo(this);
		}
	}

	public static void main(String[] args) {
		BuilderDemo builderDemo = new Builder().value01("1").value02("2").value03("3").value04("4").build();
	}


总结:
如果类的构造器或是静态工厂方法中具有多个参数,设计这种类时,使用Builder方式(构建器方式)就是种不错的选择,特别是当大多是参数都是可选的时候。与使用传统的重叠构造器模式相比,使用Builder模式的客户端代码将更容易阅读和编写,构建器也比javabean更加安全。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值