當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();
}
}
當然以上都是適用於初始化的時候需要較多參數的類,但是如果參數較少建議使用靜態工廠代替構造器