一直习惯在写java bean的时候用到get、set方法获取值或设置对象属性值,或通过构造方法进行初始化,最近抽空找缘缘和飞哥出来坐了一坐,聊了聊规划及最近在新环境接触一些新的技术学习点和一些有趣的事情,比如docker容器化等,后面主要讲到了builder模式以及jdk1.8点特性,确实有点儿意思。
对于设计模式来说,首先最熟悉的莫过于单例和工厂以及抽象工厂,模版或者适配器 责任链 等倒是builder接触少,最近恰好在写会员服务,主表的字段过多set属性带时候挺繁琐,代码可读性很差,于是改成builder模式,代码简洁大方很多,不足就是要写一些多余的代码,会产生多余的Builder对象,消耗内存,有利也有弊吧,其实也大可按正常的编码风格去写的。
直接贴代码吧。
public class RegMemberResponse implements java.io.Serializable {
private static final long serialVersionUID = -9074331307655116161L;
@ApiModelProperty("会员ID")
private String mebId;
@ApiModelProperty("卡号")
private String cardNo;
@ApiModelProperty("激活码")
private String activeCode;
@ApiModelProperty("密码")
private String password;
public String getMebId() {
return mebId;
}
public String getCardNo() {
return cardNo;
}
public String getActiveCode() {
return activeCode;
}
public String getPassword() {
return password;
}
private RegMemberResponse(Builder builder){
this.mebId = builder.mebId;
this.cardNo = builder.cardNo;
this.activeCode = builder.activeCode;
this.password = builder.password;
}
public static class Builder{
private String mebId;
private String cardNo;
private String activeCode;
private String password;
public Builder mebId(Integer mebId) {
this.mebId = mebId.toString();
return this;
}
public Builder cardNo(String cardNo) {
this.cardNo = cardNo;
return this;
}
public Builder activeCode(String activeCode) {
this.activeCode = activeCode;
return this;
}
public Builder password(String password) {
this.password = password;
return this;
}
public RegMemberResponse build(){
return new RegMemberResponse(this);
}
}
}
```
关于Builder的一点说明
线程安全问题
由于Builder是非线程安全的,所以如果要在Builder内部类中检查一个参数的合法性,必需要在对象创建完成之后再检查。
publicUserbuild(){
User user =newuser(this);
if(user.getAge() >120) {
thrownewIllegalStateException(“Age out of range”);// 线程安全}returnuser;}
上面的写法是正确的,而下面的代码是非线程安全的:
publicUserbuild(){if(age >120) {
thrownewIllegalStateException(“Age out of range”);// 非线程安全}
returnnewUser(this);}
网友评论