多条件校验方法重构咨询:实现短路执行并保留日志输出
解决方案
方式1:基于状态变量的扁平化短路执行
用一个布尔变量跟踪当前校验状态,每一步仅在前序校验通过时才执行后续校验,同时记录对应日志。这种写法完全避免多层嵌套if,逻辑清晰直观。
示例代码:
public boolean isEligible() { boolean isPassing = true; if (isPassing) { boolean attr1Result = isAttr1Set(); log.info("校验isAttr1Set结果: {}", attr1Result); isPassing = attr1Result; } if (isPassing) { boolean attr2Result = isAttr2Set(); log.info("校验isAttr2Set结果: {}", attr2Result); isPassing = attr2Result; } if (isPassing) { boolean attr3Result = isAttr3Set(); log.info("校验isAttr3Set结果: {}", attr3Result); isPassing = attr3Result; } if (isPassing) { boolean attr4Result = isAttr4Set(); log.info("校验isAttr4Set结果: {}", attr4Result); isPassing = attr4Result; } return isPassing; }
每个if分支依赖isPassing的状态,只有前序校验通过才会进入后续分支执行校验,同时立即记录该校验的结果日志,完全符合短路执行+日志保留的需求。
方式2:封装校验任务,迭代执行(高扩展性)
如果后续可能新增更多校验方法,这种方式的扩展性更强。先将每个校验的执行+日志逻辑封装为独立任务,再遍历任务列表,遇到失败的校验直接终止流程。
示例代码:
// 定义校验任务的函数式接口 @FunctionalInterface private interface ValidationTask { boolean execute(); } public boolean isEligible() { List<ValidationTask> validationTasks = Arrays.asList( () -> { boolean result = isAttr1Set(); log.info("校验isAttr1Set结果: {}", result); return result; }, () -> { boolean result = isAttr2Set(); log.info("校验isAttr2Set结果: {}", result); return result; }, () -> { boolean result = isAttr3Set(); log.info("校验isAttr3Set结果: {}", result); return result; }, () -> { boolean result = isAttr4Set(); log.info("校验isAttr4Set结果: {}", result); return result; } ); for (ValidationTask task : validationTasks) { if (!task.execute()) { return false; } } return true; }
新增校验时只需在任务列表中添加新的ValidationTask实现即可,无需修改核心流程逻辑,代码维护成本更低。
内容的提问来源于stack exchange,提问作者Jayadeep
相关产品推荐
相关产品推荐

