通过阅读《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());
}
}