避免两次遍历验证器列表

Avoid two passes over a list of validators

我正在使用以下代码验证传递给文件中一系列命令的参数:

            for (Parameter p : s.getCommand(idx).getParameters()) {
                for (ValidationFactory.TYPES validationType : ValidationFactory.TYPES.values()) {
                    validator = ValidationFactory.getValidator(validationType, errors);
                    try {
                        validator.validate(p);
                    } catch (ValidationException e) {
                        Report.logErrorMessage("Failed to validate: " + validationType);                            
                        continue;
                    }
                }
            } 

然后在 ValidationFactory 中我有:

public final class ValidationFactory {

public enum TYPES {
    PROPERTIES, 
    PORTS
};

private ValidationFactory() {
}

public static AbstractValidator getValidator(TYPES validationType,
        ValidationErrors errors) {
    switch (validationType) {
    case PROPERTIES:
        return new PropertiesValidator(errors);
    case PORTS:
        return new PortRangeValidator(errors);
    default:
        return null;
    }
}}

这段代码工作得非常好,并且允许在以后添加新的验证器。不过有一个相对较小的问题...

外层 for 循环遍历将传递给命令的参数列表,而内层 for 循环遍历可以执行验证的验证器列表。但是,根据参数的不同,可能没有必要继续使用第二个验证器进行验证,第一个验证器可能已经完成了工作……因此,PropertiesValidator 可能已经完成了所需的工作,现在无需调用第二个验证器,但无论如何它都会调用它。我想我可以使用一个变量来维护验证状态,然后如果已经完成就可以跳过。两个验证器都扩展了一个 AbstractValidator class,这将是最好的地方。

我想一次完成验证,同时保持工厂模式的结构。我正在考虑加入某种委托人 class。我正在使用 java 1.6,所以我无法打开字符串参数,这很好。

定义一个Generic Validator,它将对所有验证器通用,并在属性和端口验证中定义特定的验证。因此,现在通过将通用逻辑移至通用验证器并将特定验证移至其他验证器,不会出现重复验证。