@Nullableアノテーションの使用法


347

私は次のように宣言されたJavaのいくつかのメソッドを見ました:

void foo(@Nullable Object obj)
{ ... }

@Nullableここの意味は何ですか?それは入力が可能であるという意味nullですか?

注釈がなくても、入力はnullになる可能性があるので、それだけではないでしょうか?


3
以下の回答から、アノテーションはnull値が受け入れ可能であることを示し、それが使用される例、試せるコードアナライザー、および解釈が異なる場合があることを学びました。なぜこのフォーマットが優れているのか見てください。特にこの質問をするために、すべてのラウンドで+1。
icedwater 2013年

8
@Nullableあなたの質問の文脈でどのライブラリが提供していますか?それはチェッカー?
8bitjunkie 2017

回答:


367

メソッドがnull値を受け入れること、およびメソッドをオーバーライドする場合はnull値も受け入れる必要があることは明らかです。

また、FindBugsなどのコードアナライザーのヒントにもなります。たとえば、そのようなメソッドが最初にnullをチェックせずにその引数を逆参照すると、FindBugsは警告を発します。


82

このアノテーションは一般的にを排除するために使用されNullPointerExceptionsます。@Nullableこのパラメータはかもしれないと言いますnull。このような動作の良い例は、Google Guiceにあります。この軽量の依存関係注入フレームワークでは、この依存関係がそうである可能性があることがわかりますnull。合格しようとするならnullアノテーションなしで、フレームワークはその仕事を拒否します。

アノテーションでさらに@Nullable使用できるものは何ですか@NotNull。ここでは、それらを適切に使用するためのいくつかのヒントを見つけることができます。IntelliJのコードインスペクションは注釈をチェックし、コードのデバッグに役立ちます。



1

確かに、まったく異なる考え方があります。私の世界では、APIの呼び出し元、データベースレコード、元のプログラマーなどの制御できないサードパーティを扱っているため、「nullを渡さない」を強制することはできません。 。Java8以降を使用しているため、ifブロックよりも少しクリーンなアプローチがあります。

public String foo(@Nullable String mayBeNothing) {
   return Optional.ofNullable(mayBeNothing).orElse("Really Nothing");
}

にスワップ.orElseすること で、そこでいくつかの例外をスローすることもできorElseThrow(() -> new Exception("Dont' send a null"))ます。

機能的に何も追加しない@Nullableを使用したくない場合は、パラメーターに名前を付けるだけでmayBe...、意図が明確になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.