You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多条件校验场景下,如何优化if语句的写法?

优化多条件校验代码的几种方案

你的这段校验代码逻辑通顺,但确实可以通过几种方式让代码更简洁、易维护,下面是几个实用的优化方向:

1. 利用Optional API简化空值校验

针对Optional类型的空值判断,直接用orElseThrow方法可以把“判断是否存在+不存在抛异常”的逻辑压缩成一行,避免重复的!isPresent()判断:

// 简化空值校验逻辑
user.orElseThrow(() -> new ResourceNotFoundException(MessageUtil.ERROR_USER_NOTFOUND));
account.orElseThrow(() -> new ResourceNotFoundException(MessageUtil.ERROR_ACCOUNT_NOT_FOUND));

// 后续状态与权限校验保持原逻辑即可
if (account.get().getStatus() == AccountStatus.CLOSED) {
    throw new BadRequestException("Error. This account is closed");
}

if (!user.get().getGroups().contains(group)) {
    throw new BadRequestException("Error. You are not a member of this group");
}

这种方式最轻量化,改动小,同时保留了原有的异常语义,适合快速优化。

2. 提取独立校验方法,让主逻辑更清晰

如果校验逻辑后续可能需要复用,或者想让主业务方法更聚焦核心逻辑,可以把每个校验规则封装成独立的私有方法:

// 主业务方法中的校验调用
validateUserExists(user);
validateAccountExists(account);
validateAccountIsActive(account.get());
validateUserInGroup(user.get(), group);

// 私有校验方法
private void validateUserExists(Optional<User> user) {
    if (!user.isPresent()) {
        throw new ResourceNotFoundException(MessageUtil.ERROR_USER_NOTFOUND);
    }
}

private void validateAccountExists(Optional<Account> account) {
    if (!account.isPresent()) {
        throw new ResourceNotFoundException(MessageUtil.ERROR_ACCOUNT_NOT_FOUND);
    }
}

private void validateAccountIsActive(Account account) {
    if (account.getStatus() == AccountStatus.CLOSED) {
        throw new BadRequestException("Error. This account is closed");
    }
}

private void validateUserInGroup(User user, Group group) {
    if (!user.getGroups().contains(group)) {
        throw new BadRequestException("Error. You are not a member of this group");
    }
}

这样主方法里的校验逻辑一目了然,每个校验方法的职责单一,也方便后续单独修改某条校验规则。

3. 校验器模式(适合复杂/可扩展场景)

如果后续可能需要新增更多校验规则,或者想让校验逻辑更符合开闭原则,可以用校验器模式:

首先定义一个通用的校验器接口:

@FunctionalInterface
interface Validator {
    void validate() throws Exception;
}

然后把每个校验规则封装成Validator实例,最后批量执行:

// 构建校验器列表
List<Validator> validators = Arrays.asList(
    () -> user.orElseThrow(() -> new ResourceNotFoundException(MessageUtil.ERROR_USER_NOTFOUND)),
    () -> account.orElseThrow(() -> new ResourceNotFoundException(MessageUtil.ERROR_ACCOUNT_NOT_FOUND)),
    () -> {
        if (account.get().getStatus() == AccountStatus.CLOSED) {
            throw new BadRequestException("Error. This account is closed");
        }
    },
    () -> {
        if (!user.get().getGroups().contains(group)) {
            throw new BadRequestException("Error. You are not a member of this group");
        }
    }
);

// 批量执行校验
for (Validator validator : validators) {
    validator.validate();
}

这种方式的好处是新增校验规则时,只需要往列表里加新的Validator实例即可,不需要修改原有校验逻辑,适合校验规则较多、需要频繁迭代的场景。


内容的提问来源于stack exchange,提问作者Steve Otieno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 11:10:23