鏈?zhǔn)秸{(diào)用:chained invocation(鏈?zhǔn)秸{(diào)用)或者Method chaining,這種風(fēng)格的API設(shè)計叫做fluent API或者Fluent interface,常用于Builder Pattern(建造者模式)。
本質(zhì)就是在方法里面返回對象/其他來實現(xiàn)連續(xù)的調(diào)用。
優(yōu)點 編程性強 、可讀性強、代碼簡潔。
缺點 不太利于代碼調(diào)試 (一點是因為想看某個方法的返回值時無法debug,還有一點是異常處理不方便)。
網(wǎng)上看了一下別人的文章、問答,發(fā)現(xiàn)了很多很好的想法和科普,整理了一下,記錄自己的學(xué)習(xí)
實現(xiàn)方式
一、基礎(chǔ)版
和日常的Java Bean不同的是,set方法里面多了個return this,使得我們可以多次調(diào)用自己類的實例方法。
public class OperateLog {
private int id;
private String action;
private String opreator;
private String content;
private Date time;
public OperateLog setId(int id) {
this.id = id;
return this;
}
public OperateLog setAction(String action) {
this.action = action;
return this;
}
public OperateLog setOpreator(String opreator) {
this.opreator = opreator;
return this;
}
public OperateLog setContent(String content) {
this.content = content;
return this;
}
public OperateLog setTime(Date time) {
this.time = time;
return this;
}
public int getId() { return id; }
public String getAction() { return action; }
public String getOpreator() { return opreator; }
public String getContent() { return content; }
public Date getTime() { return time; }
}
二、建造者模式
替代多參數(shù)構(gòu)造函數(shù)的建造者模式。
考慮到線程安全等問題,OperateLog里面的屬性都為final,且構(gòu)造函數(shù)為private,只能作為私有構(gòu)造方法被Builder調(diào)用,不開放給外部。
附上大神整理的建造者模式的介紹與實例。
public class OperateLog {
// 真正的屬性都是不可變的
private final int id;
private final String action;
private final String operator;
private final String content;
private final Date time;
// 私有構(gòu)造方法,只被 Builder 類調(diào)用
private OperateLog(Builder builder) {
this.id = builder.id;
this.action = builder.action;
this.operator = builder.operator;
this.content = builder.content;
this.time = builder.time;
}
public static class Builder {
//必須參數(shù)
private int id;
private String action;
private Date time;
// 可選參數(shù)
private String content = "";
private String operator;
public Builder(int id, String action, Date time) {
this.id = id;
this.action = action;
this.time = time;
}
//使用設(shè)置好的參數(shù)值新建 OperateLog 對象
public OperateLog build(){
return new OperateLog(this);
}
// 每個 setter 方法都返回當(dāng)前的對象,做到鏈?zhǔn)秸{(diào)用
public Builder setContent(String content) {
this.content = content;
return this;
}
public Builder setOperator(String operator) {
this.operator = operator;
return this;
}
}
}
調(diào)用
new OperateLog.Builder(1,"插入",new Date()).setContent("插入新記錄").build();
//建造者模式只有在調(diào)用build()之后才會創(chuàng)建OperateLog對象。
PS:idea在生成Setter時自帶一個builder模版可以生成帶 return this 的setter。

image.png