Java如何优化动态表单自定义校验代码以提升可读性
表单校验器代码优化方案
核心优化思路
- 拆解嵌套逻辑为独立的语义化校验方法,替换原有的双重否定判断,大幅提升代码可读性
- 把待校验字段按类型分组定义为常量,后续调整校验字段时无需修改核心校验逻辑,可维护性更强
- 正向判断合法场景,不符合规则直接返回校验失败,逻辑更直观易理解
优化后代码实现
import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.function.Function; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; // 省略类注解定义,仅保留校验相关核心代码 public class InspectedItemValidator implements ConstraintValidator<ValidInspectedItem, InspectedItemCreationDto> { // 字符串类型待校验字段集合 private static final List<Function<InspectedItemDto, String>> STRING_VALIDATE_FIELDS = Arrays.asList( InspectedItemDto::getItem, InspectedItemDto::getDescription, InspectedItemDto::getSerialLot ); // 非字符串类型待校验字段集合 private static final List<Function<InspectedItemDto, ?>> NON_STRING_VALIDATE_FIELDS = Arrays.asList( InspectedItemDto::getWoNumber, InspectedItemDto::getTotalPieces, InspectedItemDto::getOkPieces, InspectedItemDto::getNokPieces ); @Override public boolean isValid(InspectedItemCreationDto values, ConstraintValidatorContext context) { for (InspectedItemDto currentItem : values.getInspectedItems()) { boolean isFullEmptyRow = isAllStringBlank(currentItem) && isAllNonStringNull(currentItem); boolean isFullFilledRow = isAllStringFilled(currentItem) && isAllNonStringNotNull(currentItem); // 既不是全空行也不是全填行,属于部分填写,校验不通过 if (!isFullEmptyRow && !isFullFilledRow) { // 可选扩展:此处可添加自定义错误提示,告知用户具体哪一行存在未填字段 // context.disableDefaultConstraintViolation(); // context.buildConstraintViolationWithTemplate("第X行存在未填写的必填字段").addConstraintViolation(); return false; } } return true; } /** * 校验当前检验项所有字符串字段均为空白 */ private boolean isAllStringBlank(InspectedItemDto item) { return STRING_VALIDATE_FIELDS.stream() .map(fieldGetter -> fieldGetter.apply(item)) .allMatch(String::isBlank); } /** * 校验当前检验项所有字符串字段均不为空白 */ private boolean isAllStringFilled(InspectedItemDto item) { return STRING_VALIDATE_FIELDS.stream() .map(fieldGetter -> fieldGetter.apply(item)) .noneMatch(String::isBlank); } /** * 校验当前检验项所有非字符串字段均为null */ private boolean isAllNonStringNull(InspectedItemDto item) { return NON_STRING_VALIDATE_FIELDS.stream() .map(fieldGetter -> fieldGetter.apply(item)) .allMatch(Objects::isNull); } /** * 校验当前检验项所有非字符串字段均不为null */ private boolean isAllNonStringNotNull(InspectedItemDto item) { return NON_STRING_VALIDATE_FIELDS.stream() .map(fieldGetter -> fieldGetter.apply(item)) .noneMatch(Objects::isNull); } }
额外优化建议
如果后续需要扩展校验规则,比如限制数值字段范围、字符串格式等,只需新增对应的独立校验方法即可,不会影响现有逻辑的可读性。
内容的提问来源于stack exchange,提问作者Alin Balan
相关产品推荐
相关产品推荐

