object == null或null == object?

时间:2010-03-03 06:37:17

标签: java null

我从某人那里听说null == objectobject == null 检查

更好

例如:

void m1(Object obj ) {
   if(null == obj)  // Is this better than object == null ? Why ?
       return ;
   // Else blah blah
}

有什么理由还是这是另一个神话? 谢谢你的帮助。

11 个答案:

答案 0 :(得分:133)

这可能是从C学习的习惯,以避免这种拼写错误(单=而不是双==):

if (object = null) {

将常量放在==左侧的约定在Java中并不实用,因为Java要求if中的表达式求值为boolean,所以除非常量是boolean,否则无论以何种方式放置参数都会出现编译错误。 (如果它是一个布尔值,你不应该使用== ......)

答案 1 :(得分:31)

正如其他人所说,这是从C中学到的习惯,以避免拼写错误 - 尽管即使在C中,我也希望有足够警告级别的优秀编译器发出警告。正如Chandru所说,如果使用类型为Boolean的变量(您不在示例代码中),以这种方式与Java中的null进行比较只会导致问题。我会说这是一种非常罕见的情况,而且不值得改变你在其他地方编写代码的方式。 (即使在这种情况下,我也不会费心扭转操作数;如果我想清楚地考虑反转它们,我相信我可以算出等号。)

没有提及是很多人(我自己肯定包括在内)发现if (variable == constant)形式更具可读性 - 这是表达自己的一种更自然的方式。这是盲目地从C复制约定的原因。在假设在一个环境中可能有用的东西在另一个环境中有用之前,你应该总是质疑实践(正如你在这里做的那样:)。 / p>

答案 2 :(得分:26)

除了对象类型为Boolean之外,这在Java(1.5+)中没有多大价值。在这种情况下,这仍然可以很方便。

如果object为if (object = null)

Boolean将不会导致Java 1.5+中的编译失败,但会在运行时抛出NullPointerException

答案 3 :(得分:9)

在Java中没有充分的理由。

其他几个答案声称这是因为你可能会意外地将其分配而不是平等。但是在Java中,你必须在if中有一个布尔值,所以这个:

if (o = null)

不会编译。

这在Java中唯一重要的时间是变量是否为boolean:

int m1(boolean x)
{
    if (x = true)  // oops, assignment instead of equality

答案 4 :(得分:6)

这也与以下内容密切相关:

if ("foo".equals(bar)) {

如果您不想处理NPE,这很方便:

if (bar!=null && bar.equals("foo")) {

答案 5 :(得分:5)

这个技巧应该可以防止v = null类型的错别字。

但Java只允许布尔表达式作为if()条件,因此技巧没有多大意义,编译器无论如何都会找到那些错别字。

尽管如此,它仍然是C / C ++代码的宝贵技巧。

答案 6 :(得分:3)

出于同样的原因,你在C中这样做;赋值是一个表达式,因此您将文字放在左侧,这样如果您不小心使用=而不是==,就无法覆盖它。

答案 7 :(得分:3)

那适合那些喜欢左侧常数的人。 在大多数情况下,在左侧使用常量将阻止抛出NullPointerException(或具有另一个nullcheck)。例如,String方法equals也是一个空检查。左边的常量将阻止你编写额外的支票。其他方式也在以后执行。左边的空值只是一致的。

像:

 String b = null;
 "constant".equals(b);  // result to false
 b.equals("constant");  // NullPointerException
 b != null && b.equals("constant");  // result to false

答案 8 :(得分:2)

与以下代码比较:

    String pingResult = "asd";
    long s = System.nanoTime ( );
    if ( null != pingResult )
    {
        System.out.println ( "null != pingResult" );
    }
    long e = System.nanoTime ( );
    System.out.println ( e - s );

    long s1 = System.nanoTime ( );
    if ( pingResult != null )
    {
        System.out.println ( "pingResult != null" );
    }
    long e1 = System.nanoTime ( );
    System.out.println ( e1 - s1 );

输出(多次执行后):

null != pingResult
325737
pingResult != null
47027

因此,pingResult != null是赢家。

答案 9 :(得分:1)

由于其commutative propertyobject == nullnull == objectYoda version)之间的唯一区别是认知性:代码如何由读者阅读和消化。我不知道确切的答案,但我知道我个人更喜欢将我正在检查的对象与其他东西进行比较,而不是将其他东西与我正在检查的对象进行比较,如果是没有任何意义。从主题开始,然后将值与之比较。

在其他一些语言中,这种比较风格更有用。

为了安全地防止丢失“=”符号,我认为写null == objectdefensive programming的错误行为。围绕这个特定代码的更好方法是通过junit测试来保证行为。请记住,错过“=”的错误可能不依赖于方法的输入参数 - 您不依赖于其他人正确使用此API - 因此junit测试非常适合安全防范。无论如何,你会想要编写junit测试来验证行为;缺少“=”自然属于范围。

答案 10 :(得分:0)

用不同的方式写尤达条件

在Java

String myString = null;
if (myString.equals("foobar")) { /* ... */ } //Will give u null pointer

尤达条件

String myString = null;
if ("foobar".equals(myString)) { /* ... */ } // will be false