2016-07-07 6 views
0

Javaでカスタム検証ルールの拡張ポイントを作成する必要があります。それを行う最善の方法を見つけるのを助けてくれますか?カスタム拡張ポイントの最適実装は何ですか

私のコードは、私はベースValidatorインタフェースを使用して、カスタムバリデータとそれを実装するのに適していることを知っているこの

... 
public myClass() { 
... 
//some business logic 
customValidator.validate(event); //custom 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で得ることですが、それは余りにも過ぎていると思います。

私はいつかお勧めできますか?

答えて

1

基本的には、文字列に基づいてバリデータをインスタンス化したいですか?可能な実装は複数あり、どれが最適かはわかりませんが、選択した実装はファクトリで抽象化する必要があります。ロジックでコードを散らばって、バリデーターを文字列から見つけてインスタンス化する必要はありません。

など。

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メソッドは静的であってはならないことに注意してください。検証者はステートレスであるため、同じインスタンスを再利用したいので、validateメソッドを静的にするというアイディアがありますが、そのようにすると、デザインの柔軟性とテスト可能性が低下します。

同じバリデータインスタンスが確実に再利用されるようにするには、ValidatorFactoryComposition Rootにインスタンス化され、このファクトリがバリデータをキャッシュすることを確認できます。

関連する問題