java.util.Objects.isNullvsオブジェクト== null


92

ご存知のように、java.util.Objectsあります

このクラスは、オブジェクトを操作するための静的ユーティリティメソッドで構成されています。

そのような方法の1つはObjects.isNull()です。

私の理解ではObjects.isNull()、2番目のを省略して、誤ってnull値をオブジェクトに割り当てる可能性を排除します=

ただし、APIノートには次のように記載されています。

このメソッドは、述語、filter(Objects :: isNull)として使用するために存在します

ifステートメントで使用object == nullする必要がある理由/状況はありますか?Objects.isNull()

Objects.isNull()述語だけに限定する必要がありますか?


4
心配しているのが偶発的な割り当てだけの場合は、単にif(null == variable)一貫して使用できます…
Holger

1
@Holder、心配すべき偶発的な割り当ては何ですか?これはJavaです。タイプエラーが発生します。
Louis Wasserman 2016年

1
@LouisWassermanでvariableはありませんBoolean
Alexis C.

2
@AlexisC、それはでは問題になるだろう小さな、小さな例数:あなたの変数には、非常に特殊なタイプである必要があり、そしてあなたは非常に特定のタイプミスをしなければならない、あなたは、任意のIDEやコンパイラ解析を使用してすることはできませんそれはあなたのためにそれを指摘するでしょう(ほとんどすべてのIDEがそうするように)。その場合は気にせず安心です。
Louis Wasserman 2016年

1
仕事で、私はnull == objectの多くのインスタンスを見てきました。聞いてみると、偶発的なヌルの割り当てを防ぐためだと言われました。ここで提供されたコメントと回答に基づいて、私はそれが味の母であると信じる傾向があります。
ルーカスT

回答:


82

ifステートメントでObjects.isNull()よりもobject == nullを使用する必要がありますか?

あなたが見れば、ソースコードIsNull方法、

 /* Returns true if the provided reference is null otherwise returns false.*/

 public static boolean isNull(Object obj) {
     return obj == null;
 }

同じです。違いはありません。安心してお使いいただけます。


14
はい、使用できますが、ツールによって実行されるローカルフロー分析に干渉する可能性があります。つまり、プレーンな「==」を使用すると、フロー分析で、t​​henブランチでは逆参照が適切ではないが、elseブランチでは安全であることがわかります。適切なエラー/警告が表示されるか、何も表示されません。isNull()を呼び出す間接参照を使用すると、その知識がツールに失われる可能性があります。
Stephan Herrmann 2016年

3
わずかなパフォーマンスの違いがあります。オブジェクトのnull参照をJavaでチェックする場合と、静的メソッドを呼び出す場合では違いがあります。そして、それは私たち全員が慣れている==を使用するよりも少しはっきりしません。
ケビン

3
でよりセマンティックに使用さ== nullifますが、isNullはラムダ式で使用するのに最適です。
レオナルドラモスドゥアルテ

1
それは確かに合法ですが、オペレーターに勝る利点はありません。そのため、チームで作業する場合は、目的に応じて使用してください。
Alex Panchenko

78

Objects.isNull Java8ラムダフィルタリング内での使用を目的としています。

書くのははるかに簡単で明確です:

.stream().filter(Objects::isNull) 

書くより:

.stream().filter(x -> x == null).  

ifただし、ステートメント内ではどちらも機能します。の使用== nullはおそらく読みやすいですが、最終的にはスタイルの好みに要約されます。


「書くのがはるかに簡単/明確」であるという主張には同意しません。1.それはもっと簡潔ではありません。2.特に最新のJava構文に精通していない人にとっては、明らかに表現力が低下します。日常的にJavaを書いているのではない私(私はScalaを書いています)として、nullをチェックするだけの静的メソッドを持っているのは幻覚だと感じます。この方法は、利点を追加せずに流暢なコードを読み取ることからの単なる混乱です。
Eli Golin3

12

ソースを見てください:

public static boolean isNull(Object obj) {
    return obj == null;
}

null値を確認するには、次を使用できます。

  • Objects.isNull(myObject)
  • null == myObject // avoids assigning by typo
  • myObject == null // risk of typo

sObjects.isNullを対象としているという事実はPredicate、上記のように使用することを妨げるものではありません。


1
タイプミスのリスクとはどういう意味ですか?
Ashish Lohia 2017

2
@AshishLohiaの=代わりに使用する==(null許容Booleanラッパーでない限りコンパイルされません、公平です)
Mena

5
(myObject = null)でコンパイルエラーが発生する場合、タイプミスのリスクはJavaではなくC ++の問題です。null == myObjectではなくmyObject == nullを常に使用する必要があります。
Tomas

1
@TomasMarikは私のコメントで述べたように、タイプミスのリスクはBooleanJavaのnull許容ラッパーに限定されています。これは確かに非常にまれです(そして、への割り当てnullが条件であるかのようにチェックされるとコンパイラに警告を出します)が、不可能ではありません。
メナ

7

ifステートメントでObjects.isNull()よりもobject == nullを使用する必要がある理由/状況はありますか?

はい、1つの理由は、コードを単純に保つことです。ifステートメントobject == nullは明確でよく知られています。たとえばタイプミスがある場合、それはいかなる不正行為にもつながることはありません。

私の理解では、Objects.isNull()は、2番目の=を省略することにより、誤ってnull値をオブジェクトに割り当てる可能性を排除します。

ある場合if (object = null) {}省略し =、それがコンパイルされませんか、の場合に警告を生成しますBooleanオブジェクト!実際に使用する理由はありませんObjects.isNull(object) ifステートメントobject == null内でする。2つのバリエーションを並べて示します。

if (object == null) {
}

if (Objects.isNull(object)) {
}

Objects.isNull()を述語のみに限定する必要がありますか?

はいと言えますが、Objects.isNull()どこでも使用するための技術的なハードルはありませんが、述語のみに限定されています。

以下からのpublic static boolean isNull(Object obj)メソッドのjavadocを:

@apiNoteこのメソッドは、java.util.function.Predicate、filter(Objects :: isNull)として使用するために存在します

したがって、この方法を使用しない場合述語場合、実際には、単純なのに比べて、より複雑で面倒な式を使用していることになりobject == nullます。

これは、の利点を比較するためのスニペットです Objects.isNull(object)

List<String> list = Arrays.asList("a", "b", null, "c", null);

// As ready-made predicate
long countNullsWithPredicate = list.stream().filter(Objects::isNull).count();

// Lambda
long countNullsWithLambda = list.stream().filter(object -> object == null).count();

// Reimplement the Objects::isNull predicate
long countNullsWithAnonymous = list.stream().filter(new Predicate<Object>() {
    @Override
    public boolean test(Object obj) {
        return obj == null;
    }
}).count();

2

意味的には違いはありませんが、読みやすさのために私は以下のものを好みますwhatever == null

import static java.util.Objects.isNull;

// Other stuff...

if(isNull(whatever)) { 

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