删除执行多个验证的代码片段中的重复项

Removing duplication in a code fragment that performs multiple validations

我想将这个方法重构为没有重复的东西:

public class ContextValidator
{
    public static boolean validate(LoggingContext loggingContext) throws ValidationException
    {
        if (!isValidValue(loggingContext.getApplicationlevel()))
        {
            throw new ValidationException(UserErrors.UE_BAD_PARAMS,
                new Object[] { "Applicationlevel", "must be between 0 and 5" });
        }

        if (!isValidValue(loggingContext.getAuditlevel()))
        {
            throw new ValidationException(UserErrors.UE_BAD_PARAMS,
                new Object[] { "Auditlevel", "must be between 0 and 5" });
        }

        if (!isValidValue(loggingContext.getBillinglevel()))
        {
            throw new ValidationException(UserErrors.UE_BAD_PARAMS,
                new Object[] { "Billinglevel", "must be between 0 and 5" });
        }

        if (!isValidValue(loggingContext.getMetricslevel()))
        {
            throw new ValidationException(UserErrors.UE_BAD_PARAMS,
                new Object[] { "Metricslevel", "must be between 0 and 5" });
        }

        if (!isValidValue(loggingContext.getSecuritylevel()))
        {
            throw new ValidationException(UserErrors.UE_BAD_PARAMS,
                new Object[] { "Securitylevel","must be between 0 and 5" });
        }
        return true;
    }

    private static boolean isValidValue(int applicationlevel)
    {
        return (applicationlevel >= 0) && (applicationlevel <= 5);
    }
}

其中 getXXXLevel() 是返回 int 的方法。我尝试创建对字符串的方法引用的映射:Map<Supplier<Integer>, String> (ex: loggingContext::getBillinglevel, "BillingLevel") 并在 forEach() 中测试它们 - 不幸的是 ValidationException 被选中,因此不能使用我的映射类型从 forEach 中抛出它.

将整个 if 包装到辅助方法中:

public static void checkAndThrow(int val, String name)
    throws ValidationException
{
    if (!isValidValue(val) {
        throw new ValidationException(UserErrors.UE_BAD_PARAMS,
            new Object[] { name, "must be between 0 and 5" });
    }
}

现在您可以将每个 if 替换为对 checkAndThrow 的调用:

public static boolean validate(LoggingContext loggingContext)
    throws ValidationException
{
    checkAndThrow(loggingContext.getApplicationlevel(), "Applicationlevel");
    checkAndThrow(loggingContext.getAuditlevel(), "Auditlevel");
    checkAndThrow(loggingContext.getBillinglevel(), "Billinglevel");
    ...
    return true;
}