链式调用动态构造配置对象的写法是否有正式设计模式名称?
这种链式设值写法是行业内广泛使用的成熟编码范式,有正式的命名,不是某几个框架自创的非标准写法。
正式名称
这种范式的核心实现叫方法链(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

