Effective Java第二條:遇到多個構造器參數時要考慮用構建器

通過閱讀《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());

}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章