[學(xué)習(xí)筆記]Java鏈?zhǔn)秸{(diào)用(方法鏈)-建造者模式

鏈?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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容