2016-07-04 17 views
0

は、私が誤っていたことを私に起こったこの:@NotNullと@Nullable、矛盾Javaアノテーション

@javax.annotation.Nullable 
@javax.validation.constraints.NotNull 

コンパイラが文句を言わなかったし、すべてがうまくいくように見えました。

今では、2つ以上の注釈が互いに矛盾しているときに、内部的に何が起こっているのだろうかと思います。さらに、秩序は関係するのだろうか?

はこれよりも同じこの

@Nullable 
@NotNull 

ですか?

@NotNull 
@Nullable 

一般的なアノテーションではどのように機能しますか?誰が勝ちますか?

編集:私は必ずしもこれら二つの注釈

+0

これらの注釈の完全修飾名を投稿することはできますか。 'javax.validation'アノテーションを意味しますか? –

答えて

4

注釈自体では、ロジックにコードが反映されません。各注釈は、適切な注釈プロセッサで処理する必要があります。注釈プロセッサは、注釈を意味のあるものにする人です。

official tutorialを確認してください:

注釈、メタデータの形式は、プログラム自体の一部ではないプログラムに関するデータを提供します。注釈は注釈を付けるコードの操作に直接影響を与えません。

注釈は、それらの間で多数の用途を持っている:コンパイラため

  • 情報 - 注釈がエラーを検出または警告を抑制するために、コンパイラによって使用することができます。
  • コンパイル時と展開時の処理 - ソフトウェアツールは、などのコード、XMLファイル、およびを生成する注釈情報を処理することができます。
  • ランタイム処理 - いくつかの注釈は、実行時に調べることが可能です。

上記の2つの注釈を考えてみましょう。まず第一に、彼らは相互排他的ではなく、異なる性質を持っています。

@javax.annotation.NullableJSR-305の一部であり、反対の1つ - @javax.annotation.Nonnullです。これらの注釈は、クラスフィールド、メソッドパラメータ、およびメソッドの結果に注釈を付けるように設計されています。コードアナライザで使用することができます。その1つは、Findbugs

@javax.validation.constraints.NotNullは、JSR-303 aka Bean Validationの一部です。したがって、これらの注釈には異なるプロセッサがあるため、この注釈は@javax.annotation.Nullableと共通していません。

注釈セマンティクスに疑問があるたびに、ドキュメントをチェックして、コードを実行して何が起こるかを確認する必要があります。

2

について、一般的な答えを探しています注釈は、あなたのプログラムの意味を変更しないでください。 Javaコンパイラは、それらをプログラムの内部表現に追加します(コンパイル時のみ、またはクラスファイルに保存するか、実行時に保存します)。ただし、それ以外の場合は無視されます。具体的には、「矛盾する」注釈についてはわかりません。

注釈は、外部ツールやライブラリで使用されている、と彼らは(例えば、エラーメッセージを印刷して)好きなように競合の注釈に対処することがあります。