连贯性设计要求配置方法返回this以支持链式调用,统一返回当前具体类型而非void或Object,用自限定泛型维持子类类型,区分配置与终结方法,并通过接口抽象实现可组合扩展。

让方法返回 this 是提升 Java 类设计连贯性的直接手段——它把一连串操作自然地“串”在同一个对象上,读起来像一句完整指令,而不是零散的动作集合。
每个配置方法都该返回当前类型
连贯性始于统一的设计契约:所有用于设置、调整或初始化状态的方法,返回类型必须是当前类(或其泛型限定类型),末尾写 return this;。这不是装饰,而是明确告诉调用者:“我还在这个对象上工作”。
- 避免使用
void返回值,否则链式在第一步就断开 - 字段修改后立即返回
this,不引入中间变量或临时对象 - 返回类型写具体类名(如
UserBuilder),而非Object或泛型通配符,保障编译期类型提示
用自限定泛型守住继承链
当子类扩展链式父类时,父类方法若固定返回 Builder,子类调用后会丢失自身类型,导致 new HttpBuilder().setHost("x").addHeader() 编译失败。解决办法是让父类带上类型参数:
- 声明为
class Builder<T extends Builder<T>> - 每个方法返回
T,例如public T timeout(int ms) - 子类继承时指定自身:
class RestBuilder extends Builder<RestBuilder>
区分配置方法和终结方法
连贯性不等于无限链式。需清晰划分两类方法职责,否则语义模糊、易出错:
立即学习“Java免费学习笔记(深入)”;
-
配置方法(如
withTimeout()、enableRetry()):只改状态,返回this,支持继续链式 -
终结方法(如
build()、execute()、toMap()):返回最终结果(User、Response、boolean),不再接受后续点调用 - 带副作用的方法(如
validate()、log())慎返this,除非它是可观测性链的一部分(如.log().retry().execute())
配合接口抽象支撑组合扩展
真正提升连贯性的,不只是单个类的链式能力,而是整套 API 能自由拼装。把行为拆到接口中,再由构建器聚合:
- 定义
Configurable<T>接口,含T enableFeature(String id)等通用方法 - 不同模块实现该接口(如
AuthConfigurator、TimeoutConfigurator) - 主构建器提供
with(Configurable<?> config)方法,内部委托执行并返回自身 - 使用者可按需组合:
new Client().with(auth).with(timeout).baseUrl("x").build()
不复杂但容易忽略:连贯性不是堆砌语法糖,而是靠类型设计、职责分离和接口抽象共同撑起来的表达力。



















