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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:36:04