[学习笔记]Java链式调用(方法链)-建造者模式

链式调用:chained invocation(链式调用)或者Method chaining,这种风格的API设计叫做fluent API或者Fluent interface,常用于Builder Pattern(建造者模式)
本质就是在方法里面返回对象/其他来实现连续的调用。

优点 编程性强 、可读性强、代码简洁。

缺点 不太利于代码调试 (一点是因为想看某个方法的返回值时无法debug,还有一点是异常处理不方便)。

网上看了一下别人的文章、问答,发现了很多很好的想法和科普,整理了一下,记录自己的学习

实现方式

一、基础版

和日常的Java Bean不同的是,set方法里面多了个return this,使得我们可以多次调用自己类的实例方法。

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;  }
}
二、建造者模式

替代多参数构造函数的建造者模式。
考虑到线程安全等问题,OperateLog里面的属性都为final,且构造函数为private,只能作为私有构造方法被Builder调用,不开放给外部。
附上大神整理的建造者模式的介绍与实例。

public class OperateLog {
    // 真正的属性都是不可变的
    private final int id;
    private final String action;
    private final String operator;
    private final String content;
    private final Date time;

    // 私有构造方法,只被 Builder 类调用
    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 {
        //必须参数
        private int id;
        private String action;
        private Date time;

        // 可选参数
        private String content = "";
        private String operator;

        public Builder(int id, String action, Date time) {
            this.id = id;
            this.action = action;
            this.time = time;
        }
        //使用设置好的参数值新建 OperateLog 对象
        public OperateLog build(){
            return new OperateLog(this);
        }

        // 每个 setter 方法都返回当前的对象,做到链式调用
        public Builder setContent(String content) {
            this.content = content;
            return this;
        }

        public Builder setOperator(String operator) {
            this.operator = operator;
            return this;
        }
    }
}

调用

new OperateLog.Builder(1,"插入",new Date()).setContent("插入新记录").build();
//建造者模式只有在调用build()之后才会创建OperateLog对象。

PS:idea在生成Setter时自带一个builder模版可以生成带 return this 的setter。


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容