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

前言

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

后语

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

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

如转载请在文章尾部添加

原作者来自 adlered 个人技术博客:https://www.stackoverflow.wiki/

评论

  1. 网上的相关资料也蛮少的。我的理解是把一些特定的级联调用方法封装好,组成了DSL供用户调用。期待有大佬解答

  2. 那dsl是啥意思?

  3. 感谢,我会订正的

  4. 感谢指教,FluentInterface的概念要比我所说的"级联调用"更有深度一些,这就加以修改。

  5. 更广义上叫做平滑接口。

    https://martinfowler.com/bliki/FluentInterface.html

  6. doge 链式调用,各种builder里很常见

取消