null == foo 和 foo == null 的区别

4

这可能只是一个风格问题,但我正在阅读一本Java编程书籍(《Programming Android》),作者在变量方法之前都会先声明null,这是我不熟悉的做法。例如:

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

或者

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

替代

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

我不认为顺序在语义/句法上有任何影响,你觉得呢?只是好奇。


“=” 是赋值运算符,你的意思是 “==”(相等运算符)。 - Bart Kiers
2
@Reimeus:这个约定的确是为了防止这种情况——使用“常量”(null)放在左边,这样做的想法是,如果你忘记了第二个等号,就会在编译时出现错误,否则它将是一个无效的赋值。 - Cᴏʀʏ
2
以那种方式编写代码,尤达。 - nachokk
因为你避免了赋值和比较错误。当你在左侧有一个常量并且得到编译器警告 "bar" = foo vs foo = "bar",我认为这也被称为 Yoda 风格。 - Moritz Roessler
5个回答

11

这可能是从C/C++遗留下来的习惯。在C中,你会把常量放在左边,因为如果你将=错写成了==,就会出现错误,因为你不能将某个值赋给一个常量。在Java中,这是不必要的,因为if (foo = null)也会出现错误,提示对象引用不是布尔值。


1
今天早些时候我并不是有意对你很苛刻。1+ - Hovercraft Full Of Eels

5

这是从C/C++遗留下来的。将值放在==运算符左侧可以避免意外使用赋值=运算符带来的问题。C编译器会捕捉到14 = var作为错误,但是var = 14会被编译通过,而你本意应该是要输入var == 14。在Java中没有太多这样做的理由,但有些人仍然这样做。


4
有时候使用有序的操作可以避免空指针异常,例如如果一个String变量来自外部,并且您像这样进行比较:
if(foo.equals("foo")){
}

如果您这样做:

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

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

这样做不仅可以达到你的目的,还可以避免空指针异常,以防 String foo 为空。


使用字符串时,将“常量”放在前面以避免空指针是完全有道理的。在任何其他情况下,这只是一个关于你个人偏好的问题。 我更喜欢(object == null)。 - Daniel Bo

2

没有区别。

第二个原因仅仅是因为C/C++中程序员经常使用赋值而不是比较。

例如:

// 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中,=运算符用于赋值,而==运算符用于测试等效性,但是人们通常在if语句中使用=而不是==,通过第二种方法,开发人员会得到编译时错误,因为null不能在赋值语句的左侧使用。

新增内容

if (object = null) {

在Java中,将常量放在==的左侧并没有什么用处,因为Java要求if语句中的表达式评估为布尔值,所以除非常量是布尔值,否则无论你如何放置参数,都会得到编译错误。(如果是布尔值,你也不应该使用==...)


1

没有区别,和

if (foo == null)
    enter code here

在编程中,首选的方法是将常量放在等号左边;然而在 C 语言中,您需要将常量放在左边,否则如果您使用 = 而不是 == 将会出现错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接