pp经常使用Nutz框架中的NutMap,我问他为什么,他说new时候方便、赋值也方便,因此接触到链式调用之类的概念。
先不去争论究竟“链式调用”描述的准确还是“方法链”描述的准确。在这里全都叫链式调用(哈哈哈哈红红火火恍恍惚惚~)。
一、何为链式调用
所谓链式调用,用java的StringBuffer类的append()方法来解释最好不过了。
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("123").append("456").append("789").append("abc");
System.out.println(stringBuffer);
而我们平时用的map
是怎么做的呢?
Map<String,String> map = new HashMap<>();
map.put("123","123");
map.put("456","456");
map.put("789","789");
System.out.println(map);
是的,我理解的链式调用就是Object.method().method().method()……而不是每次都是从Object.method()开始重复的Object.method()。
二、自制链式调用
其实点开StringBuffer的append()就能够看到他的原理了:
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
明白了吗?就是酱紫,返回了一个this,就是StringBuffer对象,而我们平时给成员变量写的赋值语句都是什么呢?
private int variable;
public int getVariable() {
return variable;
}
public void setVariable(int variable) {
this.variable = variable;
}
所以只要我们把每个set方法的返回值修改为自身的对象就能够实现神奇的链式调用了。
private int variable;
public int getVariable() {
return variable;
}
//注意修改所有set函数的返回值~
public Main setVariable(int variable) {
this.variable = variable;
return this;
}