一、遇到多个构造器参数时要考虑使用构建器
a、静态工厂和构造器有共同的局限性,它们都不能很好地扩展到大量的可选参数。
b、举个例子:
比如在我们的项目中,用一个bean来表示一个活动的标签,这个活动有很多的标签,这些标签中有几个是必须的,还有一些是可选的标。而大多数的活动中某几个可选的标签中都会有非零的值。
c、对于上面的类子中,应该怎么去操作呢?程序员们大多数会想到重载构造器来完成上面的例子。
用代码来说下上面的例子:
package com.wzy;
/**
* @author weizhaoyang01
*/
public class Activities {
/**
* 标签1:必须标签
*/
private final String label1;
/**
* 标签2:必须标签
* @param label1
*/
private final String label2;
/**
* 标签3:可选标签
* @param label3
*
*/
private final String label3;
/**
* 标签4:可选标签
* @param label4
*
*/
private final String label4;
/**
* 标签5:可选标签
* @param label5
*
*/
private final String label5;
/**
* 标签6:可选标签
* @param label6
*
*/
private final String label6;
public Activities( String label1,String label2) {
this(label1,label2,null);
}
public Activities(String label1,String label2,String label3){
this(label1,label2,label3,null);
}
public Activities(String label1,String label2,String label3,String label4){
this(label1,label2,label3,label4,null);
}
public Activities(String label1,String label2,String label3,String label4,String label5){
this(label1,label2,label3,label4,label5,null);
}
public Activities(String label1,String label2,String label3,String label4,String label5,String label6){
this.label1=label1;
this.label2=label2;
this.label3=label3;
this.label4=label4;
this.label5=label5;
this.label6=label6;
}
}
在上面的例子中是用第一个构造函数只有两个必要的参数,第二个构造函数有一个可选的参数,第三个构造函数有两个可选的参数,以此类推,最后一个构造函数包含所有的可选参数。
d、对于上面的代码中,当你想要创建实例的时候,就利用参数列表最短的构造器,但是该列表中要包含设置的所有的所有参数:
Activities activities = new Activities("a","b","c","d","e","f");
e、上面方式的缺点如下:
1)、这个构造器本来你有很多不想设置的参数,但是还得不得不给它们传值
2)、问题随着参数增多的时候,它就很快就失去了控制
3)、重叠构造器的方式可行,但是很多参数的时候,客户端的代码会很难编写并且较难以阅读,如果参数的值的顺序错乱的话,编译器也不会报错,但是运行时会报错。
f、采用JavaBeans模式
1、先调用一个无参数的构造器来创建对象,然后再调用setter的方法来设置每个必要的参数以及每个相关的可选参数。
代码如下:
public Activities(){
}
public void setLabel1(String str1){
label1=str1;
}
public void setLabel2(String str1){
label1=str1;
}
public void setLabel3(String str1){
label1=str1;
}
public void setLabel4(String str1){
label1=str1;
}
public void setLabel5(String str1){
label1=str1;
}
public void setLabel6(String str1){
label1=str1;
}
Activities activities=new Activities();
activities.setLabel1("a");
activities.setLabel2("b");
activities.setLabel3("c");
activities.setLabel4("d");
activities.setLabel5("e");
activities.setLabel6("f");
2、这种方式弥补了重叠构造器模式的不足,但是创建实例很容易,这样产生的代码阅读起来也很容易。
3、但是这样做有它的缺点:
1)、在构造过程中,JavaBean可能处于不一致的状态,类是无法仅仅通过检验构造器参数的有效性来保证一致性的,试图使用处于不一致的状态的对象将会导致失败,调试起来是很困难的。
下回分享解决上面两种方式的问题的一种模式-构建器。
明天见~~