2016-10-19 2 views
1

パラメータに@Nonnullと注釈を付けて、後でPreconditions.checkNotNull()にチェックするのは意味がありますか?@ NonnullとPreconditions.checkNotNull(...)の両方を使用する

これらの違いは何ですか?私が理解する限り、@Nonnullを使用すると、契約を指定するだけですが、IDEで指示しない限り、それ以上確認しません。これは正しいです?

答えて

4

仕様と実装の違いは次のとおりです。 @NonNullはルーチンの仕様を示し、Preconditions.checkNotNull()はルーチンを検証する1つの方法を示します。

@NonNullは、仮パラメータに対するコントラクトを指定します。メソッドは、対応する実際の引数としてnullを使用して決して呼び出されるべきではありません。

このような仕様を検証する方法は複数あります。

  • あなたはassertステートメントまたは、同等に、Preconditions.checkNotNull()でチェック実行時に実行することができます。これにより、実行時に契約の違反を動的に発見し、プログラムをクラッシュさせます。これにより、以前の警告メッセージを与えることでコードのデバッグが容易になりますが、コードの品質は向上しません。

  • IDEまたは他のツールを使用してコンパイル時に静的検査を実行できます。サウンドツールを使用する場合、実行可能な実行が仕様に違反してプログラムがクラッシュしないことが保証されます。

どのように使用されるべきかを文書化するには、メソッドの仕様が必要です。 @NonNullは簡潔で機械可読であるため、Javadocとして英語ではなく@NonNullアノテーションを使用して記述することもできます。だから、@NonNull注釈を書くべきです。

仕様の正しさを検証することは任意ですが、有用です。ランタイムチェックと静的チェックの両方を使用した検証は、ベルトアンドサスペンダーのアプローチです。これは、2つの異なる技術を使用して仕様を検証します。 FindBugsが警告を発行しなくても、あなたのコードにnullnessエラーが存在する可能性があるため、FindBugsなどの不安定な静的チェックツールを使用すると、ランタイムチェックを実行することをお勧めします。 Nullness CheckerChecker Framework)のようなサウンドツールを使用する場合は、ランタイムチェックは不要です。しかし、コードクラッタが少ししかなく、実行時のオーバーヘッドが少ししかありません。

(null値が引数として渡された場合、特定の例外がスローされる必要があることに注意してください)これは、すでにメソッド本体にPreconditions.checkNotNull()などのコードを含める必要があります。あなたのプログラムはnullを渡すことはありません。投げられた正確な例外を指定する仕様は、クライアントコードにとって特に有用ではありません。クライアントは実際に呼び出しが成功するかどうかを知りたいだけで、クライアントはcatchブロックNullPointerException。したがって、クライアントが仕様で必要とする主な情報は、nullが不正な値であるということです。

関連する問題