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());

}

}


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