null セーフ

Java では型システムで null 安全性を表現できませんが、Spring Framework では、API およびフィールドの null 可能性を宣言できるように、org.springframework.lang パッケージで次のアノテーションが提供されています。

  • @Nullable (Javadoc) : 特定のパラメーター、戻り値、フィールドが null になる可能性があることを示すアノテーション。

  • @NonNull (Javadoc) : 特定のパラメーター、戻り値、フィールドを null にすることができないことを示すアノテーション (それぞれ、@NonNullApi および @NonNullFields が適用されるパラメーター、戻り値、フィールドでは必要ありません)。

  • @NonNullApi (Javadoc) : パラメーターおよび戻り値のデフォルトのセマンティクスとして非 null を宣言するパッケージレベルでのアノテーション。

  • @NonNullFields (Javadoc) : フィールドのデフォルトのセマンティクスとして null 以外を宣言するパッケージレベルでのアノテーション。

Spring Framework 自体はこれらのアノテーションを利用しますが、これらのアノテーションを Spring ベースの Java プロジェクトで使用して、null セーフ API やオプションで null セーフフィールドを宣言することもできます。ジェネリクス型引数、可変引数、配列要素の null 許容宣言はまだサポートされていません。Null 可能性宣言は、マイナーリリースを含め、Spring Framework リリース間で微調整される予定です。メソッド本体内で使用される型の null 許容性は、この機能の範囲外です。

Reactor や Spring Data などの他の一般的なライブラリは、同様の nullability 配置を使用する null セーフ API を提供し、Spring アプリケーション開発者に一貫した全体的なエクスペリエンスを提供します。

ユースケース

Spring Framework API nullability の明示的な宣言を提供することに加えて、これらのアノテーションは IDE(IDEA や Eclipse など)によって使用され、実行時の NullPointerException を回避するために null 安全に関連する有用な警告を提供できます。

Kotlin はネイティブで null-safety をサポートしているため、これらは Kotlin プロジェクトで Spring API を null-safe (英語) にするためにも使用されます。詳細については、Kotlin サポートドキュメントを参照してください。

JSR-305 メタアノテーション

Spring アノテーションには、JSR 305 (英語) アノテーション (休止中だが広く普及している JSR) でメタアノテーションが付けられます。JSR-305 メタアノテーションを使用すると、IDEA や Kotlin などのツールベンダーは、Spring アノテーションのサポートをハードコードすることなく、一般的な方法で null 安全性サポートを提供できます。

Spring の null セーフ API を利用するために、プロジェクトのクラスパスに JSR-305 依存関係を追加することは必要でも推奨でもありません。コードベースで null 安全性アノテーションを使用する Spring ベースのライブラリなどのプロジェクトのみ、コンパイラーの警告を回避するために、compileOnly Gradle 構成または Maven provided スコープを備えた com.google.code.findbugs:jsr305:3.0.2 を追加する必要があります。