优雅的规则校验链需职责清晰、可插拔、可跳过、可追踪,核心是责任链模式封装独立rule对象,显式控制流(failfast/全量收集),用result或optional表达状态,支持appliesto动态跳过。

在规则校验链中组织多个顺序执行的布尔判断,核心不是堆砌 if-else,而是让每条规则职责清晰、可插拔、可跳过、可追踪。Java 中实现“优雅”的关键在于结构解耦 + 显式控制流 + 语义明确。
用责任链模式封装单条规则
每条校验规则应是一个独立对象,统一实现接口,不依赖其他规则: ```java public interface Rule { Result check(Context context); } // 返回 Result 包含 passed(是否通过)、message(失败原因)、code(错误码) ``` 这样每条规则只关注自身逻辑,比如 `NotNullRule`、`LengthRule`、`PatternRule`。添加/移除规则只需增减链上节点,不影响主流程。构建可中断的顺序执行链
校验链应默认按序执行,但一旦某条规则失败,可选择继续或终止: - 用 `for-each` 遍历规则列表,显式检查每一步返回值; - 不用嵌套 if,避免深层缩进; - 提供 `failFast = true`(默认)或 `failFast = false`(收集全部问题)两种模式。public Result validate(Context context, List<rule> rules, boolean failFast) {
List<string> errors = new ArrayList();
for (Rule rule : rules) {
Result result = rule.check(context);
if (!result.passed()) {
errors.add(result.message());
if (failFast) return Result.fail(errors); // 立即退出
}
}
return errors.isEmpty() ? Result.success() : Result.fail(errors);
}</string></rule>
用 Optional 或枚举表达校验状态
避免用 `boolean` 返回值隐藏失败细节。推荐: - 返回 `Result` 类型(含 `passed`, `message`, `code`, `timestamp`); - 或使用 `Optional支持条件跳过与上下文驱动
有些规则只在特定场景生效(如“仅当用户是 VIP 时校验积分上限”): - 规则接口增加 `appliesTo(Context)` 方法,先判断是否启用该规则; - Context 可携带 `featureFlags`、`userType`、`requestSource` 等元数据; - 这样链天然支持动态规则开关,无需改代码就能灰度启用新校验。本质上,优雅不来自语法糖,而来自把“判断”变成可组合、可复用、可诊断的对象。规则链不是 if 的替代品,而是把 if 的语义从代码行提升为业务概念。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











