1

私のSpringプロジェクトにはサービスがあります

  public Pageable<MyObject>findAccount(String accountExternalId){
  if (accountExternalId== null) {
            throw new ProjectException("Missing account");
     }
  ...
}

したがって、5 つの引数を Java で処理するときは、null 入力オブジェクトをチェックするための 5 つの if を作成する必要があります。これを行うのではなく、使用javax.annotation.Nonnullして、次のようなことをしたいjavax.annotation.CheckForNullです。

public Pageable<MyObject>findAccount(@Nonnull String accountExternalId){
         ...
  }

そしてfindbugsを使用します

  <groupId>
        com.google.code.findbugs
  </groupId>
  <artifactId>
        findbugs
  </artifactId>

では、この注釈によってユーザーがNull値を渡さないようにするにはどうすればよいのでしょうか? それとも、null を渡す必要がなく、情報提供のみを目的としていることに注釈を付けるだけですか?

4

2 に答える 2

0

次の 2 つのオプションがあります。

  • クライアント コードが null 値を渡すことを許可しますが、そうすると実行時エラーをスローします。
  • null 値を渡す可能性のあるコードを実行しないことで、クライアント コードが null 値を渡さないようにします。

ランタイム チェック アプローチは、サンプル コードで使用されます。注釈からランタイム チェックを生成する@Nonnullこともできます。

コンパイル時のチェック アプローチ (「静的解析」とも呼ばれます) が推奨され、FindBugs アプローチです。@Nonnullライブラリの作成者は、注釈を使用してライブラリのコントラクトを記述します。ライブラリ コードのビルド時に静的解析が実行されます。また、クライアント コードがライブラリの契約に違反している可能性があることが静的解析で示された場合、クライアント コードは実行されません。

クライアント コードのビルド時に静的解析が常に実行される場合、ライブラリでの実行時チェックは必要ありません。ライブラリに実行時チェックを含めることを選択した場合でも、静的分析は、テストまたは展開の前にコンパイル時にバグを検出するため、依然として有用です。

保証が必要な場合は、FindBugs を使用したくない場合があります。FindBugs は、一部のエラーを検出するベスト エフォート型のツールですが、すべてのエラーを検出しようとするわけではありません。さらに、FindBugs は、仮パラメーター (!) に適用された場合@NonNullと同じ意味として扱います。@Nullable

静的チェック用の代替ツールを検討することをお勧めします。一例はChecker Frameworkです。FindBugs とは異なり、正確性が保証され、より正確な分析が使用されます。欠点は、コードに@Nullable注釈を付けなければならないことですが、すでにそうすることを望んでいるようです。

于 2015-06-29T09:13:13.187 に答える