Java 中实现布尔条件校验并抛出异常的优雅方式

java 8+ 虽无内置的“断言为真则继续,否则抛异常”工具方法,但可通过 `objects.requirenonnull()` 变通、自定义静态工具方法或结合 `boolean` 封装与 `optional` 实现语义清晰的校验逻辑。

在 Java 开发中,我们常需对布尔表达式做“快速失败”校验:若条件不成立(即 false),立即抛出指定异常(如 ValidationException)。遗憾的是,Java 标准库并未提供类似 checkTrue(boolean, Supplier) 的原生工具方法(对比 Guava 的 Preconditions.checkArgument() 或 Apache Commons Lang 的 Validate.isTrue())。

不过,有几种专业、简洁且符合现代 Java 风格的实现方式:

✅ 推荐方案:自定义静态工具方法(最清晰、可复用)

public class Checks {
    public static void assertTrue(boolean condition, Supplier exceptionSupplier) {
        if (!condition) {
            throw exceptionSupplier.get();
        }
    }
}

使用示例:

Checks.assertTrue(user.isActive(), () -> new ValidationException("User is not active"));
Checks.assertTrue(order.getAmount() > 0, IllegalArgumentException::new);

⚠️ 注意:Optional.of(boolean) 不可行!

问题中提到的 Optional.of(myFalseReturningMethod) 是错误用法——Optional.of() 接收的是非 null 引用类型,而 boolean 是基本类型,无法直接传入;即使包装为 Boolean,Optional.of(null) 也会立即抛 NullPointerException,完全偏离校验意图:

// ❌ 编译错误(基本类型不兼容)  
Optional.of(true).orElseThrow(...); // 这里 true 是 boolean,不是 Boolean

// ❌ 逻辑错乱:若 myMethod() 返回 null,会先 NPE,而非你的 ValidationException  
Optional.ofNullable((Boolean) myFalseReturningMethod()).orElseThrow(...);

✅ 替代技巧(无需额外方法):利用 Objects.requireNonNull()

虽非语义最优,但在简单场景下可“借壳”使用(需将 boolean 转为对象并利用其 null 行为):

// 仅适用于需校验 "非 false" 且可接受布尔转对象开销的场景(不推荐常规使用)
Objects.requireNonNull(Boolean.TRUE

.equals(myFalseReturningMethod()) ? Boolean.TRUE : null, () -> new ValidationException("Check request"));

⚠️ 此写法可读性差、性能冗余,仅作技术演示,生产环境请优先选用自定义 assertTrue 方法

✅ 进阶:集成到业务校验链(如 Spring @Valid 或自定义注解)

对于高频校验场景,建议结合 AOP 或声明式验证(如 Hibernate Validator 的 @AssertTrue),实现零侵入式逻辑分离。

总结:Java 原生未提供布尔断言工具,但通过一行自定义静态方法即可获得媲美 Guava 的表达力与健壮性。相比冗长的 if (!cond) throw...,Checks.assertTrue(...) 在可读性、复用性和团队规范上更具优势——这也是现代 Java 工程实践中「小而精的工具类」的价值所在。