如何简化包含大量逻辑或(||)运算符的Java代码?
简化含大量逻辑或(||)运算符的代码方案
这段if条件堆砌了大量零散的验证逻辑,可读性差且后续维护成本高,以下是几种实用的简化思路:
1. 拆分验证逻辑为独立方法
把同类验证(比如文件大小、单个用户字段)拆成单独的小方法,每个方法专注验证一类规则,返回「是否验证不通过」的结果:
// 提取魔法数字为常量,提升可读性 private static final long MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB private static final long MIN_FILE_SIZE = 10 * 1024; // 10KB private static final int PHONE_LENGTH = 10; private static final int EMAIL_MIN_LEN = 8; private static final int EMAIL_MAX_LEN = 58; // 通用文件验证方法 private boolean isFileInvalid(Long beforeCompress, Long afterCompression) { return beforeCompress > MAX_FILE_SIZE || afterCompression < MIN_FILE_SIZE || beforeCompress < afterCompression; } // 手机号验证方法 private boolean isPhoneInvalid(String phone) { String phoneStr = phone.toString(); return phoneStr.length() != PHONE_LENGTH || validationRegExp.onlyNumbersRegExp(phoneStr) || serviceJpa.existsLogisticsPersonByPhone(phone); } // 邮箱验证方法 private boolean isEmailInvalid(String email) { return email.length() < EMAIL_MIN_LEN || email.length() > EMAIL_MAX_LEN || validationRegExp.emailValidationRegExp(email); } // 同理,密码、姓名、护照号等字段都可以拆成独立的验证方法
2. 用验证器列表统一管理规则
定义一个简单的函数式接口,把所有验证规则放到列表中,通过流式操作判断是否有任意规则不通过:
// 定义验证器接口 @FunctionalInterface interface Validator { boolean validate(); } // 主逻辑中组装所有验证规则 List<Validator> validators = Arrays.asList( () -> isFileInvalid(fileBeforeCompressTmp1Passport, fileAfterCompressionTmp1Passport), () -> isFileInvalid(fileBeforeCompressTmp1Medical, fileAfterCompressionTmp1Medical), () -> isPhoneInvalid(value.phone()), () -> isEmailInvalid(value.email()), () -> isPasswordInvalid(value.password()), () -> isSurnameInvalid(value.surname()), () -> isNameInvalid(value.name()), () -> isMiddleNameInvalid(value.middleName()), () -> isBirthDateInvalid(value.dateBirth()), () -> isPassportNumberInvalid(value.numberPassport()), () -> isRegionInvalid(value.region()), () -> isCityInvalid(value.city()) ); // 判断是否有验证不通过的情况 if (validators.stream().anyMatch(Validator::validate)) { Files.deleteIfExists(ofPassport); return ResponseEntity.ok(new MessageResponse(HttpStatus.OK.value(), STATIC_OK)); }
3. 优化验证方法的语义
当前的emailValidationRegExp和passwordValidationRegExp方法返回!matcher.matches(),语义是「验证失败返回true」,容易混淆。建议修改方法名和语义,让代码更直观:
private static final Pattern patternEmail = Pattern.compile("^[\\w.-]*@[\\w-]*+.+\\w$"); private static final Pattern patternPassword = Pattern.compile("^[0-9a-zA-Z@#$]+$"); // 修改后:验证不通过返回true,方法名直接体现语义 public boolean isEmailInvalid(String email) { return !patternEmail.matcher(email).matches(); } public boolean isPasswordInvalid(String password) { return !patternPassword.matcher(password).matches(); }
经过以上改造,原有的冗长if条件会变得结构清晰,后续新增或修改验证规则只需调整对应方法或列表即可,维护成本大幅降低。
内容的提问来源于stack exchange,提问作者Maks
相关产品推荐
相关产品推荐

