我需要为 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/