多条件校验场景下,如何优化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
相关产品推荐
相关产品推荐

