web-dev-qa-db-ja.com

どの@NonNull Javaアノテーションを使用するか

best 'NonNull'アノテーションとは何ですか?

「最高」という意味で

  • 標準的な方法、例えば将来の証明(例:標準jdkによるサポートなど)
  • IDEのサポート(Java docに表示されます)
  • Findbugsなどの静的分析ツールによるサポート
  • ランタイム分析のサポート

現在の世界の様子は次のとおりです。さらなる洞察があれば歓迎します。

  • javax.validation.constraints.NotNullDocs
    + javaxパッケージはこのように将来性があるようです
    -JEEの一部notJSE。 JSEでは、 追加のlibs をインポートする必要があります。
    -静的分析ツールではサポートされていません(ランタイム検証のみ)

  • edu.umd.cs.findbugs.annotations.NonNull ( docs
    -javaxパッケージではなく外部ライブラリ
    - deprecated findbugsバージョン3.X以降
    +静的解析に使用(findbugs、したがってSonarによる)

  • javax.annotation.Nonnull ( docs
    +静的解析に使用(findbugsで)
    - JSR-305 は、 fbメーリングリスト に示されているように、休止/デッド/不明です。著者のビル・ピューは、直接尋ねられたとしても、何年も州にコメントしていません...

  • org.Eclipse.jdt.annotation_2.0.0 ( docs 、興味深い presentation
    +は静的解析に使用されます(ただし、findbugsではなくEclipseで)
    -Eclipse専用(スタンドアロンで使用しようとしなかった)

  • org.jetbrains.annotations.NotNull ( docs
    +は静的分析に使用されます(ただし、intelliJではfindbugsでは使用されません)
    -IntelliJ専用(ただし、jarとしても公開されています)

  • lombok.NonNulldocs
    +コード生成の制御に使用
    -独自の注釈

  • Android.support.annotation.NonNulldocs
    + Android studioでの静的解析
    -Android=特定の独自の注釈

  • org.checkerframework.checker.nullness.qual.NonNulldocs
    + JSR308 Java8の一部である実装(コードのさまざまな部分に注釈を書き込む機能を導入しましたが、新しい注釈は導入しませんでした)
    +静的コードに使用(ただし、findbugsではありません)andランタイム分析
    -ただし、外部ライブラリはJava人々による endorsed のようです

現在、私は Checker Framework を使用する傾向がありますが、他のビューを楽しみにしています...

[免責事項]ここで質問されたことがわかりましたが、回答がありませんでした(または、回答が間違っていた/不完全であった/古い)[/ disclaimer]

63
Lonzak

標準の@NonNullアノテーションはありません。このような注釈を作成することは、長い間放棄されてきたJSR 305の目標でした。 JSR 305が再構成されるまで、標準の@NonNullアノテーションはありません。オラクルには、そのような計画は現在ありません。 (JEEアノテーションはJSR 305の範囲外です。)

将来を保証するために考慮すべき最も重要な要素は、注釈が型注釈か宣言注釈かです。 @NonNullは、変数自体ではなく変数の値のプロパティを示しているため、型注釈である必要があります。型注釈であると、List<@NonNull String>のように、注釈をより多くの場所に書き込むこともできます。

注釈の定義で@Targetメタ注釈を調べることにより、注釈が型注釈であるかどうかを判別できます。この記事の執筆時点では、Checker FrameworkとEclipseのバージョンのみが型注釈であると思われるため、宣言注釈であるものよりもそれらを選択します。他のアノテーションの開発者は、それらを同様にタイプアノテーションに更新できることに注意してください。私は彼らの計画を知りません。

唯一の欠点は、型注釈を使用するにはJava 8コンパイラを使用する必要があることです。 Checker Framework には、注釈を含むコードをJava 7コンパイラーでコンパイルするためのメカニズムがあります。

23
mernst