java.util.Objects.isNull vs对象== null


87

如你所知,java.util.Objects

此类包含用于对对象进行操作的静态实用程序方法。

此类方法之一是Objects.isNull()

我的理解是,Objects.isNull()通过省略第二个,可以消除意外地为对象分配空值的可能性=

但是,API注释指出:

存在此方法用作谓词filter(Objects :: isNull)

会不会有任何理由/环境对我应该使用object == nullObjects.isNull()if语句

应该Objects.isNull()只限于谓词吗?


3
如果您担心的只是意外分配,则可以简单地使用if(null == variable)一致…
Holger

1
@Holder,有什么意外的任务要担心?这是Java。您会收到类型错误。
Louis Wasserman

1
@LouisWasserman不是如果variableBoolean
Alexis C.

2
@AlexisC,在少数情况下会引起关注:您的变量必须是非常特定的类型,并且必须进行非常特定的输入错误,并且您不能使用任何IDE或编译器分析这将为您指出这一点(几乎所有IDE都会如此)。我很舒服,不用担心这种情况。
Louis Wasserman

1
在工作中,我看到了许多null == object的实例。当我询问时,我被告知这是为了防止意外的空分配。根据此处提供的评论和答案,我倾向于认为这是一种口味。
卢卡斯T

Answers:


79

应该在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
是的,可以使用它,但是它可能会干扰工具执行的局部流量分析。即,使用简单的“ ==”,任何流分析都可以看到,在then分支中取消引用不是很好,但在else分支中则是安全的。您会得到适当的错误/警告或一无所获。通过间接调用isNull(),知识可能会丢失给工具。
斯蒂芬·赫尔曼,

3
性能略有差异。Java检查对象空引用与调用静态方法会有区别。与使用我们都已经习惯使用的==相比,它的读取效果不太清晰。
凯文M

3
更语义使用== nullif,但参考isNull是伟大的lambda表达式使用。
莱昂纳多·拉莫斯·杜阿尔特

1
它当然是合法的,但对运营商没有任何好处。因此,如果您在团队中工作,请根据预期用途使用东西。
亚历克斯潘琴科

74

Objects.isNull 适用于Java 8 lambda过滤。

编写起来更加容易和清晰:

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

比写:

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

if但是,在声明中,任何一种都行得通。使用== null可能更容易阅读,但最终会归结为样式首选项。


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

这一事实Objects.isNull是为Predicates不阻止你使用它上面的。


1
您有错字风险是什么意思?
Ashish Lohia'7

2
@AshishLohia通过使用=而不是==(除非它是一个可为空的Boolean包装器,否则将不会编译,你是公平的)
Mena

5
如果(myObject = null)会导致编译错误,则C ++中的问题不是Java中的打字错误。您应该始终使用myObject == null而不是null == myObject。
Tomas Marik '18

1
正如我的评论中提到的,@ TomasMarik指出,拼写错误的风险仅限Boolean于Java中的可空包装器。实际上,这确实非常罕见(并且当null检查到的分配就像是一个条件时,将向编译器发出警告),但并非不可能。
梅纳

7

if语句中,是否应该出于任何原因/情况在Objects.isNull()上使用object == null ?

是的,原因之一是使代码保持简单。在if语句 object == null是明确和众所周知的。例如,如果有错字,就不会导致任何不良行为。

我的理解是Objects.isNull()会通过省略第二个=来消除为对象意外分配空值的机会。

如果省略if (object = null) {}with ,它将不会编译,或者在出现对象的情况下会生成警告!实际上,没有理由在if语句中使用over 。这是两个并排的变体: =BooleanObjects.isNull(object)object == null

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();

1

语义上没有区别,但出于可读性考虑,我更喜欢以下内容whatever == null

import static java.util.Objects.isNull;

// Other stuff...

if(isNull(whatever)) { 

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.