前言
之前偶然学习了一下 Dart 编程语言(不是重点),在学习官方手册时发现一个新的概念:级联调用
。这是啥东西?
于是我百度了以后,发现在 Java 中也有类似的级联调用,那它们的区别又在哪儿呢?
-📚-| 需要先了解的知识 |-📚-
语言 | 内容 | 链接 |
---|---|---|
Java | 类、方法、变量 | null |
-⭐️-| 评分 |-⭐️-
知识等级 | 实用性 | 罕见性 |
---|---|---|
基础 | 实用 | 少见 |
上手
级联调用很简单,只要稍微分析下下面的源码,就懂了。
!级联
首先我们不用级联来实现:
public class 级联 {
public static void main(String[] args) {
//实例化Guys
Guys guys = new Guys();
//执行方法
guys.boy();
guys.girl();
guys.gentleman();
guys.lady();
}
}
class Guys {
public void girl() {
System.out.println("Hey, girl!");
}
public void boy() {
System.out.println("Oh, boy!");
}
public void lady() {
System.out.println("Greetings, lady!");
}
public void gentleman() {
System.out.println("Nice to meet your, gentle!");
}
}
得到运行结果:
Oh, boy!
Hey, girl!
Nice to meet your, gentle!
Greetings, lady!
没毛病,对吧。
级联
现在,我们使用级联再来实现一次:
public class 级联 {
public static void main(String[] args) {
//实例化Guys
Guys guys = new Guys();
//执行方法
guys.boy().girl().gentleman().lady();
}
}
class Guys {
public Guys girl() {
System.out.println("Hey, girl!");
//把类再返回给你
return this;
}
public Guys boy() {
System.out.println("Oh, boy!");
return this;
}
public Guys lady() {
System.out.println("Greetings, lady!");
return this;
}
public Guys gentleman() {
System.out.println("Nice to meet your, gentle!");
return this;
}
}
得到运行结果:
Oh, boy!
Hey, girl!
Nice to meet your, gentle!
Greetings, lady!
this
public Guys xxx() {
可以看到,我们每个方法都固定了返回值类型为 Guys
,即它的母类。
而在方法的最后:
return this;
this
指向了它的母类 Guys
,所以当用户调用完以后,它就会再次返回一个 Guys
类,也就可以再次执行类中的方法了。
应用
感谢 csfwff 的补充:
级联调用也可以成为链式调用,在建造者模式(设计模式中的一种)中很常见。在我们要构建一个比较大的对象时,设定的值可能很多。通过链式调用,我们可以更有逻辑、方便地对其进行赋值。
例
使用建造者模式的伪代码:
Person person = new Person();
person.setName("CXK");
person.setAge("20");
person.setGender("男");
person.setCareer("唱跳Rap篮球");
使用链式调用(级联调用)后的伪代码:
Person person = new Person();
person.setName("CXK");
.setAge("20");
.setGender("男");
.setCareer("唱跳Rap篮球");
另外,经 D 大(88250)指出,从更广义上来讲,也叫做平滑接口(FluentInterface):
https://martinfowler.com/bliki/FluentInterface.html
后语
某些场景中,可能需要多次调用同一个类中的方法,这时候级联调用就很好地保证了语句的连贯性和可读性,好极了。
但缺点也是比较明显的——执行后的值无法直接返回,因为它要返回它的母类。所以级联调用比较适用于不需要返回值的场景,或是设定一个静态的公共值(要注意线程安全问题,点我学习),在运行过程中进行修改。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于