Java含多OR条件的大型if语句如何记录触发true的具体条件
方案1:低改造度的短路检查工具法(推荐快速改造原有代码)
利用Java的||短路特性,封装一个通用检查工具方法,每个判断命中时自动打印日志,原有代码结构几乎不用调整:
首先定义通用检查方法:
// 可以放到你的工具类里,也可以在当前类定义私有方法 private boolean checkCondition(boolean conditionResult, String conditionDesc) { if (conditionResult) { log.info("{} made statement true", conditionDesc); } return conditionResult; }
然后原有if语句改造后如下即可,逻辑和原有的完全一致,自动触发第一个命中条件的日志:
if (checkCondition(StringUtils.isTrue(foo.getArg1()), "Arg1") || checkCondition(StringUtils.isTrue(foo.getArg2()), "Arg2") || checkCondition("T".equals(foo.getArg3()), "Arg3") || checkCondition(foo.getList1().isEmpty(), "List1") /* 后续新增条件直接按格式加就行 */) { return true; }
这个方案的优势是不用动原有代码的结构,只需要给每个条件套一层方法即可,改造成本极低,逻辑和原有完全对齐。
方案2:可扩展的条件列表遍历法(适合条件多、后续频繁迭代的场景)
把判断逻辑和对应描述封装为统一结构,批量遍历执行,完全不需要写独立if语句:
如果是Java 16及以上版本,可以用record定义条件结构:
// 条件结构:第一个是判断逻辑,第二个是命中后的日志描述 record FooCondition(Predicate<Foo> predicate, String desc) {}
如果是Java 16以下版本,可以用静态内部类替代:
private static class FooCondition { private final Predicate<Foo> predicate; private final String desc; // 构造方法、getter略 }
然后把所有条件初始化到列表里,直接遍历判断即可:
// 初始化条件列表,后续新增条件只需要加这一行 private static final List<FooCondition> CONDITIONS = List.of( new FooCondition(foo -> StringUtils.isTrue(foo.getArg1()), "Arg1"), new FooCondition(foo -> StringUtils.isTrue(foo.getArg2()), "Arg2"), new FooCondition(foo -> "T".equals(foo.getArg3()), "Arg3"), new FooCondition(foo -> foo.getList1().isEmpty(), "List1") ); // 判断逻辑 public boolean checkFoo(Foo foo) { for (FooCondition condition : CONDITIONS) { if (condition.predicate().test(foo)) { log.info("{} made statement true", condition.desc()); return true; } } return false; }
这个方案的优势是后续新增条件不需要修改判断逻辑,只需要在条件列表里加一行配置即可,维护起来非常清晰。
内容的提问来源于stack exchange,提问作者Wojtek
相关产品推荐
相关产品推荐

