2017-02-28 5 views
0

私はメソッドの入力値を確認したいと私は、このようなコードを書きたいいけない:どのアプローチが入力の検証に適していますか?

void name(String name) { 
    if(name != null) { 
     //some action 
    } else { 
     //some another action 
    } 
} 

は、だから私はDecoratorパターンまたは注釈を使用することができます。

デコレーターの例:

public interface User { 
    void name(String name); 
} 

public final class dbUser { 
    //ctor... 

    void name(String name) { 
     //jdbc call for update user name 
    } 

} 

public final class CheckedNullUser { 
    private final CheckedNullUser user; 

    public CheckedNullUser(User user) { 
     this.user = user; 
    } 

    void name(String name) { 
     String inputName = "Some default value"; 

     if(name != null) { 
      inputName = name; 
     } 

     return user.name(inputName); 
    } 

} 

アノテーション例:

方が良いアプローチ
public interface User { 
    void name(@NotNull String name); 
} 

public final class dbUser { 
    //ctor... 

    void name(@NotNull String name) { 
     //jdbc call for update user name 
    } 

} 

?より良いアプローチが存在するか?

+0

dbUser.nameメソッドの最初のステートメントとしてObjects.requireNonNull(name)を使用するとどうなりますか? – toongeorges

+0

@RomcoBomco * Decorator *の例は* Decorator *の例ではなく、単純な委譲の例です。 'dbUser'と呼ばれるクラスを表示しますが、あなたのコードでは使用しないでください。あなたの擬似コードは、欠落しているコンポーネントがなければ理にかなっていません。 – CKing

+0

@CKing私のコードは、新しいCheckedNullUser(新しいdbUser(// ctor args))のようになります。name( "CKing"); CheckedNullUserクラスはdbUserクラスをデコレートします。 – RomcoBomco

答えて

0

どれが良いですか?要件とアプリケーションの動作によって異なります。

デコレータパターンを使用すると、検証のためだけにいくつかのオブジェクトが生成されるため、ガベージコレクタでの作業が増えます。 (あなたのアプリケーションがあまりにも多くのオブジェクトを生成した場合、 "世界を止める"ガベージコレクタの実行を見始める可能性があり、フリーズすることになります)。

アノテーション(Bean Validation - JSR 349)を使用すると、リフレクションが活用されるため、アプリケーションにリアルタイムに近い要件がある場合、処理が遅くなる可能性があります。

これらの2つから、コードでは各フィールドで実行されるチェックを簡単に理解して簡単に見つけることができるため、アノテーションアプローチが特に適しています。他のアプローチについて今

https://docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/index.html

、あなたは、単にのような単一のメソッドが含まマーカーインタフェースを作成することができます次に、あなたのオブジェクトは、このインタフェースを実装して、あなたのオブジェクトを実行する前にする必要があり

boolean validate() throws ValidationException

を必要なすべてのチェックを実行するvalidateメソッドを呼び出します。

0

@NotNull注釈は何もしていません。これはヌルチェックを処理する方法ではありません。これはむしろ文書化の方法です。さらに、ほとんどのIDEでは潜在的なNULLポインタエラーについて通知します。 ヌルチェック処理については、この質問linkを見てください。 ビジネスロジック関連の検証に関しては、最初にチェックする方が良いと思います。ロジックが複雑すぎる場合は、それを処理するための補助サービスを作成することができます。

関連する問題