Java 鏈式賦值 串聯 (建造者模式)

每次在 new 一個新的物件之後要放入資料,每個set就要一行,都會需要很多行
可是如果使用建構子,又不一定每次都會需要塞入每個參數
這樣就要建立很多個建構子,而且也不能改變傳入參數的位置

所以本篇要實現的就是可以簡短的建立物件,並且達成不固定位置、數量的對物件賦值!

先看看平時是怎麼做的,使用一個Dto類別示範(省略getter)
public class Dto {
private int id;
private String name;

public void setId(int id) {
this.id = id;
}

public void setName(String name) {
this.name = name;
}
}

當我們要建立物件,並塞入資料時:
Dto dto = new Dto();
dto.setId(0);
dto.setName("test");

如果我們建立物件,並且要把它塞入List的時候:
List<Dto> dtos = new ArrayList<>();
Dto dto = new Dto();
dto.setId(0);
dto.setName("test");
dtos.add(dto);
上面就是我們一般的做法,有沒有更簡短的方式?

這裡建立一個新的類別,命名為 ChainDto用以示範
其實只要把所有 setter方法從 void 改為回傳他本身的類別
例如這裡類別叫做 ChainDto,所以就返回 ChainDto 物件即可
public class ChainDto {
private int id;
private String name;

public ChainDto setId(int id) {
this.id = id;
return this;
}

public ChainDto setName(String name) {
this.name = name;
return this;
}
}
這樣就可以串聯賦值了!
ChainDto dto = new ChainDto().setId(0).setName("test");

如果要直接加入List時也很簡單:
List<ChainDto> dtos = new ArrayList<>();
dtos.add(new ChainDto().setId(0).setName("test"));

而且順序改變也沒有問題!

如果有使用lombok的話也很簡單,在類別上面加上下面這一行就可以解決!
@Accessors(chain = true)
也附上import好了
import lombok.experimental.Accessors;

下面附上完整程式碼:

註:筆者不太確定本篇中所使用到的方法的正確名稱,如果有知道的歡迎留言補充!

參考連結:Lombok

留言