大白话之 Java 级联调用:一个类,一条语句,同时调用好几个方法,串成一串

本贴最后更新于 1935 天前,其中的信息可能已经时移世异

前言

之前偶然学习了一下 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

后语

某些场景中,可能需要多次调用同一个类中的方法,这时候级联调用就很好地保证了语句的连贯性和可读性,好极了。

但缺点也是比较明显的——执行后的值无法直接返回,因为它要返回它的母类。所以级联调用比较适用于不需要返回值的场景,或是设定一个静态的公共值(要注意线程安全问题,点我学习),在运行过程中进行修改。

  • 大白话
    17 引用 • 27 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3186 引用 • 8212 回帖 • 1 关注
  • 奇淫技巧
    2 引用 • 6 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
请输入回帖内容 ...