通過閱讀《Effective Java 第2版》,着重對比了一下重疊構造器模式、JavaBean模式、構建器模式三種創建對象的模式,謹以此博文加深記憶;
一、重疊構造器模式
/**
*
* 重疊構造器模式
* 先寫第一個只有必要參數的構造器,第二個構造器有一個可選參數,第三個構造器有兩個可選參數,以此類推;
* 缺點:如果參數比較多時,類裏面會出現一堆構造方法,並且閱讀困難,很容易就把兩個屬性參數寫顛倒位置了,
* 編譯不會出錯,但運行就會出錯了
*
*/
public class UserConstructorDo{
//必填
private int b_id; //主鍵
private String b_username;//用戶名
//可選
private String b_idcard;//身份證號
private int b_sex;//性別 1 男 2 女
private int b_age;//年齡
public UserConstructorDo(int b_id, String b_username, String b_idcard, int b_sex, int b_age) {
this.b_id = b_id;
this.b_username = b_username;
this.b_idcard = b_idcard;
this.b_sex = b_sex;
this.b_age = b_age;
}
public UserConstructorDo(int b_id, String b_username) {
this(b_id,b_username,"");
}
public UserConstructorDo(int b_id, String b_username,String b_idcard) {
this(b_id,b_username,b_idcard,0);
}
public UserConstructorDo(int b_id, String b_username,String b_idcard,int b_sex) {
this(b_id,b_username,b_idcard,b_sex,0);
}
public int getB_id() {
return b_id;
}
public String getB_username() {
return b_username;
}
public String getB_idcard() {
return b_idcard;
}
public int getB_sex() {
return b_sex;
}
public int getB_age() {
return b_age;
}
//test
public static void main(String[] args) {
UserConstructorDo userConstructorDo = new UserConstructorDo(1,"zhangsan","234353454353434534");
System.out.println(userConstructorDo.getB_sex());
}
}
二、JavaBean模式
/**
*
* JavaBean模式,通過get方法獲取參數,通過set方法設置參數
* 缺點:JavaBeans模式自身有着很重要的缺點。
* 因爲構造過程被分到了幾個調用中,在構造過程中JavaBean可能處於不一致的狀態。
* 類無法僅僅通過檢驗構造器參數的有效性來保證一致性。
* 另一點不足之處,javabean模式阻止了把類做成不可變的可能,這就需要程序員付出額外的努力來確保他的線程安全;
*
*/
public class UserJavaBeanDo{
//必填
private int b_id; //主鍵
private String b_username;//用戶名
//可選
private String b_idcard;//身份證號
private int b_sex;//性別 1 男 2 女
private int b_age;//年齡
public int getB_id() {
return b_id;
}
public void setB_id(int b_id) {
this.b_id = b_id;
}
public String getB_username() {
return b_username;
}
public void setB_username(String b_username) {
this.b_username = b_username;
}
public String getB_idcard() {
return b_idcard;
}
public void setB_idcard(String b_idcard) {
this.b_idcard = b_idcard;
}
public int getB_sex() {
return b_sex;
}
public void setB_sex(int b_sex) {
this.b_sex = b_sex;
}
public int getB_age() {
return b_age;
}
public void setB_age(int b_age) {
this.b_age = b_age;
}
public static void main(String[] args) {
UserJavaBeanDo userJavaBeanDo = new UserJavaBeanDo();
userJavaBeanDo.setB_id(1);
userJavaBeanDo.setB_username("zhangsan");
userJavaBeanDo.setB_sex(17);
System.out.println(userJavaBeanDo.getB_sex());
}
}
三、構建器模式(推薦使用)
/**
*
* build模式 既能保證像重疊構造器那樣的安全,也能實現JavaBean模式那樣的可讀性。
*
*/
public class UserBuilderDo{
//必填
private int b_id; //主鍵
private String b_username;//用戶名
//可選
private String b_idcard;//身份證號
private int b_sex;//性別 1 男 2 女
private int b_age;//年齡
private UserBuilderDo(Builder build) {
this.b_id = build.b_id;
this.b_username = build.b_username;
this.b_idcard = build.b_idcard;
this.b_sex = build.b_sex;
this.b_age = build.b_age;
}
public static class Builder {
//必填
private int b_id; //主鍵
private String b_username;//用戶名
//可選
private String b_idcard;//身份證號
private int b_sex;//性別 1 男 2 女
private int b_age;//年齡
public Builder(int b_id, String b_username) {
this.b_id = b_id;
this.b_username = b_username;
}
public Builder b_idcard(String val){
this.b_idcard = val;
return this;
}
public Builder b_sex(int val){
this.b_sex = val;
return this;
}
public Builder b_age(int val){
this.b_age = val;
return this;
}
public UserBuilderDo build(){
return new UserBuilderDo(this);
}
}
public int getB_id() {
return b_id;
}
public String getB_username() {
return b_username;
}
public String getB_idcard() {
return b_idcard;
}
public int getB_sex() {
return b_sex;
}
public int getB_age() {
return b_age;
}
public static void main(String[] args) {
UserBuilderDo userBuilderDo = new UserBuilderDo.Builder(1, "zhangsan").b_idcard("23534534534").build();
System.out.println(userBuilderDo.getB_sex());
}
}