一、常用解決方法(不能很好的擴展到大量的可選參數)
1、靜態工廠類
缺點:a、類如果不含有共有的或者受保護的構造器,就不能被子類化。
b、他們與其他的靜態方法實際上沒有任何的區別。
2、使用構造器
a、重疊構造器:該方法可行,但是當參數很多的時候,我們會發現客戶端代碼很難編寫,需要傳一些不需要的字段。
b、set方法:這種模式彌補了重疊構造器的不足,雖然這種方式,閱讀起來也比較容易,但這種方法有明顯的缺點。
1、這個構造的過程被分到了幾個調節中,在構造的過程中可能出現不一致的狀態,類無法僅僅通過檢驗構造器參數的有效性保持一致性,視圖使用不一致狀態的對象,將會導致失敗。
二、構建器的使用
我們可以讓類實例化的時候構造函數包含必填的參數,然後選填的參數則可以不必要自己來實例化
舉例:
package com.shuang.javabean;
/**
*
* @author shuang
*
*/
public class UserInfo {
/**
* 用戶名
*/
private final String userName;
/**
* 密碼
*/
private final String password;
/**
* 年齡
*/
private final int age;
/**
* 手機號碼
*/
private final String phone;
/**
* 體重
*/
private final int weight;
/**
* 脂肪含量
*/
private final int fat;
public String toString() {
return "UserInfo [userName=" + userName + ", password=" + password + ", age=" + age + ", phone=" + phone
+ ", weight=" + weight + ", fat=" + fat + "]";
}
/**
* 內部構造器
*
*/
public static class Builder{
//必要的參數
private String userName;
private String password;
/**
* 不必要的參數
*/
private int weight = 0;
private int age = 0;
private int fat = 0;
private String phone = null;
public Builder(String userName ,String password) {
this.userName = userName;
this.password = password;
}
public Builder weight(int weight){
this.weight = weight;
return this;
}
public Builder age(int age){
this.age = age;
return this;
}
public Builder fat(int fat){
this.fat = fat;
return this;
}
public UserInfo build(){
return new UserInfo(this);
}
}
private UserInfo(Builder builder){
userName = builder.userName;
password = builder.password;
phone = builder.phone;
weight = builder.weight;
age = builder.age;
fat = builder.fat;
}
}
測試代碼:
package com.shuang.test;
import com.shuang.javabean.UserInfo;
public class Test {
public static void main(String[] args) {
UserInfo userInfo = new UserInfo.Builder("張三","123456").build();
System.out.println(userInfo);
UserInfo userInfo1 = new UserInfo.Builder("李四","654321").age(18).build();
System.out.println(userInfo1);
}
}
優點:容易編寫,易於閱讀參數可選,可以像構造器一樣對參數進行校驗等等