不添加额外if判断实现多校验方法遇ko自动终止的实现方案
可行实现方案(无需逐方法前置if判断)
方案1:调整方法返回值,利用逻辑运算符短路特性(最简实现)
直接修改原有校验方法的返回值为boolean类型,校验通过返回true、不通过返回false,在check方法中用&&串联所有方法,利用逻辑与的短路特性(前序表达式为false时后续表达式不再执行)实现提前终止。
修改后的代码示例:
public void check(Object dto, int a, int b) { // 前序方法返回false时,后续方法自动不执行 method1(dto, a) && method2(dto, a, b) && method3() && method4(); } // 仅修改返回值,原有校验逻辑完全不变 private boolean method1(Object dto, int a) { if(a == 2) { dto.setResult("ko"); return false; } dto.setResult("ok"); return true; } private boolean method2(Object dto, int a, int b) { if(a + b == 5) { dto.setResult("ok"); return true; } dto.setResult("ko"); return false; } // method3、method4按同样规则修改返回值即可 private boolean method3() { // 原有校验逻辑 return 校验结果布尔值; } private boolean method4() { // 原有校验逻辑 return 校验结果布尔值; }
- 优势:代码改动量极小,逻辑直观,无额外冗余代码
- 适用场景:可以调整原有方法签名、没有其他业务依赖原有void返回值的场景
方案2:封装校验步骤列表,统一循环判断(无侵入修改原有方法)
如果不能修改原有校验方法的返回值,就把所有校验步骤按执行顺序封装成列表,循环执行时统一判断result状态,遇到ko直接终止循环。
修改后的代码示例:
public void check(Object dto, int a, int b) { // 按执行顺序封装所有校验步骤 List<Runnable> checkSteps = Arrays.asList( () -> method1(dto, a), () -> method2(dto, a, b), () -> method3(), () -> method4() ); for (Runnable step : checkSteps) { step.run(); // 统一判断校验状态,失败直接终止后续所有步骤 if ("ko".equals(dto.getResult())) { break; } } } // 原有method1、method2、method3、method4完全不用修改
- 优势:完全不改动原有校验方法的逻辑和签名,后续新增校验方法只需要往列表里加元素即可,易维护
- 适用场景:不能修改原有方法签名、校验步骤可能频繁增减的场景
方案3:责任链模式(适合复杂校验场景)
如果校验逻辑后续会频繁调整顺序、增减规则,可以把每个校验方法封装成独立的校验节点,组成责任链,链路上任意节点返回失败直接终止链路流转。该方案相对较重,适合中大型项目的复杂校验场景。
内容的提问来源于stack exchange,提问作者Daphne
相关产品推荐
相关产品推荐

