链式调用: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
网友评论