当Java的构造器遇到比较多的参数的时候,又需要对参数做出选择性的实例化。这种时候又不能把每一种构造器可能的类型全部都创建出来。所以在这种时候有以下集中解决方案:
-
最常见的使用重叠构造器:
就是 public create(int a,int b, int c,int d){
this.a = a; this.b= b; this.c = c; this.d = d;
}
public create(int a,int b, int c){
create(int a,int b, int c,0);
}
create(int a,int b){
create(int a,int b, 0);
}
create(int a){
create(int a,0);
}
-
但是重叠构造器有缺陷,当参数过多的时候就会难以编写。所以可以采用setter和getter这种javaBean方式的方法选择性创建。
但是这种方法难以维护在多线程中的对该类的原子性操作,一般都得对其进行线程的同步。
public class Test {
private int a;
private int b;
private int c;
public void setA(int a) {
this.a = a;
}
public void setB(int b) {
this.b = b;
}
public void setC(int c) {
this.c = c;
}
public int getA() {
return a;
}
public int getB() {
return b;
}
public int getC() {
return c;
}
}
-
最后是建造器(builder)的应用,在android中的Alertdialog.Builder就是采用的这种模式,它可以一次性创建好视力就不必担心原子性操作的问题。
public class Test {
private int a;
private int b;
private int c;
Builder builder;
public void setA(int a) {
this.a = a;
}
public void setB(int b) {
this.b = b;
}
public void setC(int c) {
this.c = c;
}
public void print(){
System.out.println(a+b+c);
}
public static class Builder {
private Test test;
public Builder() {
test = new Test();
}
public Builder setA(int a) {
test.setA(a);
return this;
}
public Builder setB(int b) {
test.setB(b);
return this;
}
public Builder setC(int c) {
test.setC(c);
return this;
}
public Test create(){
return test;
}
}
public static void main(String args[]) {
Builder builder = new Test.Builder();
Test test = builder.setA(1).setB(1).setC(1).create();
test.print();
}
}
当然以上都是适用于初始化的时候需要较多参数的类,但是如果参数较少建议使用静态工厂代替构造器