`起因:`最近在做統計計算,創建的實體中屬性比較多,都是一些數值,一開始是通過get、set方法進行賦值,占用了很多業務代碼方法的長度,可讀性不太好,後來改用了添加構造器的方式,稍顯精簡了一點,但是每次賦值的時候都都必須註意是不是對應上了。最後決定改用Bulider模式,確實好用很多。 下麵通過一個 ...
起因:
最近在做統計計算,創建的實體中屬性比較多,都是一些數值,一開始是通過get、set方法進行賦值,占用了很多業務代碼方法的長度,可讀性不太好,後來改用了添加構造器的方式,稍顯精簡了一點,但是每次賦值的時候都都必須註意是不是對應上了。最後決定改用Bulider模式,確實好用很多。
下麵通過一個實際的demo看一下效果
package com.github.xsh.demo.model;
/**
* @description:
* @date: 2019/5/16
**/
public class Student {
private int id;
private String name;
private String passwd;
private String sex;
private String address;
private Student(Builder builder) {
this.id = builder.id;
this.name = builder.name;
this.passwd = builder.passwd;
this.sex = builder.sex;
this.address = builder.address;
}
/**
* Builder
*/
public static class Builder {
private int id;
private String name;
private String passwd;
private String sex;
private String address;
public Builder(int id, String name) {
this.id = id;
this.name = name;
}
public Builder passwd(String passwd) {
this.passwd = passwd;
return this;
}
public Builder sex(String sex) {
this.sex = sex;
return this;
}
public Builder address(String address) {
this.address = address;
return this;
}
public Student build() {
return new Student(this);
}
}
@Override
public String toString() {
return String.format("%s[id=%s, name=%s, passwd=%s, sex=%s, address=%s]",
getClass().getSimpleName(), id, name, passwd, sex, address);
}
//為了使閱讀簡潔,此處省略getter setter
}
@Test
public void buliderTest(){
Student student = new Student.Builder(1,"jack")
.sex("男士")
.address("地球村")
.passwd("1232")
.build();
//先填充屬性再構建除對象,看上去是不是逼格滿滿
System.out.println(student);
}
列印結果如下:
Student[id=1, name=jack, passwd=1232, sex=男士, address=地球村]
最後做一下總結,什麼是Bulider模式
:
不直接生成想要的對象,而是讓客戶端利用所有必要的參數調用構造器(或者靜
態工廠),得到一個 builder 對象 。 然後客戶端在 builder 對象上調用類似於 setter 的方法,來設置每個相關的可選參數。最後客戶端調用無參的build方法來生成通常是不可變的對象
參考閱讀:《Effective java(第3版)》第 2 條:遇到多個構造器參數時要考慮使用構建器
本人首發於個人公眾號:河岸飛流 歡迎訂閱
原文地址:https://mp.weixin.qq.com/s/Tr5rQGnDPti90hTwwHAKzQ