1. ホーム
  2. java

[解決済み】メソッドの引数でNotNullアノテーションを使用する。

2022-04-17 18:32:19

質問

を使い始めたところです。 @NotNull アノテーションをJava 8で使用したところ、予期せぬ結果が得られました。

こんなメソッドがあるんです。

public List<Found> findStuff(@NotNull List<Searching> searchingList) {
    ... code here ...
}

引数searchingListにnull値を渡すJUnitテストを書きました。何らかのエラーが発生すると思っていたのですが、まるでアノテーションが存在しないかのように通過してしまいました。これは期待された動作なのでしょうか?私が理解したところでは、これはお決まりのNULLチェックコードを書くのを省略できるようにするためのものです。

NotNullが具体的に何をするものなのかの説明があれば、非常にありがたいです。

どのように解決するのですか?

@Nullable@NotNull は、それ自体では何もしません。それらはDocumentationの道具として機能することになっている。

@Nullable アノテーションは、次のような場合にNPEチェックを導入する必要性を喚起します。

  1. nullを返す可能性のあるメソッドを呼び出している。
  2. nullになりうる変数(フィールド、ローカル変数、パラメータ)の再参照を行う。

@NotNull アノテーションは、実際には、以下を宣言する明示的な契約である。

  1. メソッドはnullを返してはならない。
  2. 変数 (フィールド、ローカル変数、パラメータなど) はできません。 べきではない はヌル値を保持する。

例えば、書く代わりに

/**
 * @param aX should not be null
 */
public void setX(final Object aX ) {
    // some code
}

使用することができます。

public void setX(@NotNull final Object aX ) {
    // some code
}

さらに @NotNull がチェックされることが多い。 ConstraintValidators (例えば、spring や hibernate の場合)。

@NotNull アノテーションは、それ自身では何の検証も行いません。 アノテーション定義 は何も提供しません。 ConstraintValidator 型の参照になります。

詳しくはこちらをご覧ください。

  1. Bean バリデーション
  2. NotNull.java
  3. 制約条件.java
  4. ConstraintValidator.java