web-dev-qa-db-ja.com

javax.annotation:@Nullable vs @CheckForNull

2つの違いは何ですか?両方とも、値がnullである可能性があり、それに応じて処理する必要がある、つまりnullをチェックする必要があることを意味するようです。

更新:上記の2つの注釈は、JSR-305/FindBugsの一部です。 http://findbugs.sourceforge.net/manual/annotations .html

41
vitaly

追加したリンクからは明らかだと思います。@CheckForNullを使用し、値を使用するコードがnullをチェックしない場合、FindBugsはエラーとして表示します。

FindBugsは@Nullableを無視します。

実際には、この注釈は、包括的なNonNull注釈をオーバーライドする場合にのみ役立ちます。

値を常にチェックする必要がある場合は、@CheckForNullを使用します。 @Nullableを使用します。nullは問題ありません。

編集:@CheckForNullは現時点では十分にサポートされていないようですので、それを避けて@NonNullを使用することをお勧めします( Which @NotNull Java注釈use? )。もう1つのアイデアは、FindBugs開発者と直接連絡を取り、ドキュメントの不一致について意見を求めることです。

31
lbalazscs

@Nonnullおよび@Nullableは、IntelliJ IDEAによって正しく処理されます。 FindBugsは@Nonnullの問題を発見しましたが、@Nullable@CheckForNUllの問題は見逃していました。 IDEAおよびFindBugsで検出された問題にはコメントが付いています。

package com.db.icestation;

import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;

public class test {

    @Nullable public String nullable() {
        return "";
    }

    @Nonnull public String nonnull() {
        return null; // IDEA, findbugs
    }

    @CheckForNull public String checkForNull() {
        return null;
    }

    public static void main(String[] args) {
        System.out.println(new test().nullable().length()); // IDEA
        System.out.println(new test().nonnull().length());
        System.out.println(new test().checkForNull().length());
    }
}
9

IntelliJ Ideaでは@javax.annotation.Nullableがデフォルトでサポートされており、@Nullable引数または戻り値を逆参照しようとすると警告が発生します。

@ alexander-pavlov、「一定の条件と例外」検査の設定に@javax.annotation.CheckForNullを追加できます。 「ファイル」->「設定」->「検査」->「可能性のあるバグ」->「一定の条件と例外」->「注釈の構成」に進みます。

@CheckForNull@Nullableよりも明確な意味を持っているため、上記の回答で@lbalazscsが言及したように、これを行うことを好みます。

3
Ilya Silvestrov