java - 自定义扩展点的最佳实现是什么

标签 java validation oop design-patterns

我需要为 java 中的自定义验证规则创建一个扩展点。你能帮我找到最好的方法吗?

我的代码如下所示

...
public myClass() {
...
//some business logic
customValidator.validate(event); //custom validator
...
}

我知道使用基本 Validator 接口(interface)并使用自定义 validator 实现它是合适的。

   interface Validator {
   public static Boolean validate();
   }
   public class TrueValidator implements Validator {
   public static Boolean validate() { return true;}
   }

   public class TrueValidator implements Validator {
   public static Boolean validate() { return false;}
   }

我想知道根据某些String变量调用验证的最佳模式是什么。只用 Reflection API 获取类可以吗?我将从数据库获取我的String,创建Class并创建它的实例。

我知道的另一个解决方案是制作Validator工厂并通过String变量获取Validator,但我认为这太过分了。

你能推荐我一些吗?

最佳答案

您基本上想基于字符串实例化一个 validator ?有多种可能的实现,我无法判断哪一种最好,但您选择的实现应该在工厂中抽象出来。您不希望代码中充满了从字符串中查找并实例化这些 validator 的逻辑。

例如

public interface Validator {
    public boolean validate(ThingToValidate thingToValidate);
}

public final class TrueValidator implements Validator {
    //Note that the method is not static
    public boolean validate(ThingToValidate thingToValidate) {
        return true;
    }
}

public interface ValidatorFactory {
    public Validator createFromType(String type);
}

//Concrete validation factory using reflection
public final class ReflectiveValidatorFactory implements ValidatorFactory {
    public Validator createFromType(String type) {
        /*Use reflection to resolve the class based on the interface
        and naming conventions and/or annotations. 
        You may also cache the validator to avoid re-resolving it.*/
    }
}

//Concrete validation factory where validator types are hard-coded.
public final class HardcodedValidatorFactory implements ValidatorFactory {
    public Validator createFromType(String type) {
        switch (type) {
            case 'True': return new TrueValidator();
            //...
        }
    }
}

//Example of a client class that would use the ValidatorFactory
public final class ValidationService {
    private final ValidatorFactory validatorFactory;

    public ValidationService(ValidatorFactory validatorFactory) {
        this.validatorFactory = validatorFactory;
    }

    public boolean validate(String validatorType, ThingToValidate thingToValidate) {
        Validator validator = validatorFactory.createFromType(validatorType);

        return validator.validate(thingToValidate);
    }
}

请注意您的Valiator.validate方法不应该是静态的!我知道,由于 validator 是无状态的,您可能想重复使用同一个实例,因此有想法制作 validate方法是静态的,但这样做会使您的设计变得不那么灵活和可测试。

如果您希望确保重复使用相同的 validator 实例,那么您可以确保只有一个具体的 ValidatorFactory在您的 Composition Root 中实例化并且这个工厂缓存了 validator 。

关于java - 自定义扩展点的最佳实现是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38250521/

相关文章:

java - Project Lombok 是否与使用getter 和setter 的数据封装相矛盾?

excel - VBA 验证列表默认值

php - 什么是学习面向对象php的最好的书/站点/教程?

java - 计算时间戳之间的年、月、日差异

java - 使用 jdb : "Error: impossible to find or load the main class" 在 java 中进行调试

java - 在java中按需创建数组

java - 如何在android中挂起和恢复线程?

validation - 如何在Grails 3中注册自定义验证器类

java - 在一个具体类中定义所有抽象方法

javascript - 调用 id() 时出现意外标记)