null == foo与foo == null

时间:2013-09-21 20:58:42

标签: java null

这可能只是一个样式问题,但我正在阅读一本Java编码书('Programming Android')并且编写者在变量方法之前首先声明为null,这是我不熟悉的一种做法。例如:

if (null == foo) {
    //code here
}

if (null != foo) {
    //code here
}

而不是

if (foo == null) {
    //code here
}

我看不出顺序如何在语义上/语法上产生差异,或者我在这里错了?真的很好奇。

5 个答案:

答案 0 :(得分:11)

这可能是C / C ++遗留下来的习惯。在C中,你会在左边放置常量,因为如果你输错了=而不是==,那么就会出现错误,因为你无法为常量赋值。在Java中,这是不必要的,因为if (foo = null)也会给出错误,该错误表示对象引用不是布尔值。

答案 1 :(得分:5)

这是C / C ++的延续。如果您意外使用赋值=运算符,将值放在==运算符的左侧是有利的。当你打算输入var == 14时,C编译器会将14 = var作为错误捕获,但var = 14将编译。在Java中没有太多理由这样做,但有些人仍然这样做。

答案 2 :(得分:4)

有时订单可以保存您的空指针异常,例如如果String变量来自某个地方并且您将其比较如下:

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

然后你可能会得到空指针异常。另一方面,如果你这样做:

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

那么你不仅可以实现你的目的,而且如果String foo是null,你也可以避免空指针异常。

答案 3 :(得分:2)

没有区别。

第二个问题仅仅是因为C / C ++程序员总是进行分配而不是比较。

E.g。

// no compiler complaint at all for C/C++
// while in Java, this is illegal.
if(a = 2) {
}
// this is illegal in C/C++
// and thus become best practice, from C/C++ which is not applicable to Java at all.
if(2 = a) {
}

虽然java编译器会生成编译错误.. 两种形式之间没有什么不同。没有性能问题,但有以下注意事项:

  1.   

    第一种形式对于代码阅读器是可读的,因为人们通常会阅读   代码从左到右。

  2.   

    第二种形式对于代码编写器更好,因为在java = operator中   对于赋值和==运算符是为了测试等效,但是人   通常在if语句中使用=而不是==,第二个approch   开发人员获取Compile-Time-Error因为null无法使用   赋值语句的左侧。

  3. <强> ADDED

    if (object = null) {
    
      

    将常量放在==左侧的惯例不是   在Java中真正有用,因为Java要求表达式为if   求值为布尔值,所以除非常量是布尔值,   你输入参数的方式都会出现编译错误。 (和   如果它是布尔值,你不应该使用==反正...)

答案 4 :(得分:1)

没有区别,

if (foo == null)
    enter code here

是首选方式;但是在C中,你会将常量放在左边,因为如果使用=而不是==

会出现错误