You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

链式调用动态构造配置对象的写法是否有正式设计模式名称?

回答

这种链式设值写法是行业内广泛使用的成熟编码范式,有正式的命名,不是某几个框架自创的非标准写法。

正式名称

这种范式的核心实现叫方法链(Method Chaining),当它用来实现连续的配置、组装逻辑时,对应的上层设计风格叫做流畅接口(Fluent Interface)。它不属于GoF提出的23种经典设计模式,是行业经过长期实践沉淀出的通用编码实践。

它的实现逻辑非常简单:类中的属性设置方法不再按照传统JavaBean规范返回void,而是执行完属性赋值后返回当前对象自身的引用(即return this),上一个方法的返回值可以直接接续调用下一个方法,不需要反复书写对象变量名。
对应你示例中的Options类,最简实现代码如下:

public class Options {
    private int fontSize;
    private Color color;
    private boolean showLabels;

    public Options fontSize(int fontSize) {
        this.fontSize = fontSize;
        return this;
    }

    public Options color(Color color) {
        this.color = color;
        return this;
    }

    public Options showLabels(boolean showLabels) {
        this.showLabels = showLabels;
        return this;
    }
}

行业普及度

这种写法的应用范围极广,你提到的Spring Security安全配置是Java生态里非常典型的使用案例,除此之外你能在绝大多数主流工具、框架里看到它的身影:

  • Java生态中常用的效率工具Lombok直接提供了@Accessors(chain = true)注解,不需要开发者手动写return this逻辑,编译期就会自动生成符合链式调用规范的setter方法;经典的Builder构造器模式,绝大多数实现也会结合方法链来简化写法
  • JDK本身就有大量方法链的应用,比如StringBuilder的字符串拼接、Java 8引入的Stream流式处理,本质都是基于方法链实现的
  • 跨语言场景下这种写法也非常普遍:JavaScript早年jQuery的DOM操作链式调用、Python生态Pandas的数据处理链式调用,核心思路完全一致

和传统setter写法的区别

你提到的传统零散setter写法是JavaBean规范下的标准写法,和链式写法不存在功能、性能层面的本质差异,只是编码风格的区别。链式写法的核心优势是减少冗余的变量名重复书写,同一组关联配置可以顺着调用链连贯阅读,不会被零散的变量名打断逻辑。
注意不要把这种直接在目标对象上调用链式setter的写法和Builder模式混淆:Builder模式通常会单独定义一个独立的Builder类,核心解决的是多参数构造、不可变对象创建的问题,而你示例里的写法是直接在目标对象上操作,属于纯粹的方法链实现,Spring中HttpSecurity的配置就属于这类用法。


内容的提问来源于stack exchange,提问作者dasdawidt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:18:24