这可能只是一个风格问题,但我正在阅读一本Java编程书籍(《Programming Android》),作者在变量方法之前都会先声明null,这是我不熟悉的做法。例如:
if (null == foo) {
//code here
}
或者
if (null != foo) {
//code here
}
替代
if (foo == null) {
//code here
}
我不认为顺序在语义/句法上有任何影响,你觉得呢?只是好奇。
这可能是从C/C++遗留下来的习惯。在C中,你会把常量放在左边,因为如果你将=
错写成了==
,就会出现错误,因为你不能将某个值赋给一个常量。在Java中,这是不必要的,因为if (foo = null)
也会出现错误,提示对象引用不是布尔值。
这是从C/C++遗留下来的。将值放在==运算符左侧可以避免意外使用赋值=运算符带来的问题。C编译器会捕捉到14 = var作为错误,但是var = 14会被编译通过,而你本意应该是要输入var == 14。在Java中没有太多这样做的理由,但有些人仍然这样做。
String
变量来自外部,并且您像这样进行比较:if(foo.equals("foo")){
}
然后可能会得到空指针异常。另一方面,如果您这样做:
if("foo".equals(foo)){
}
这样做不仅可以达到你的目的,还可以避免空指针异常,以防 String
foo 为空。
没有区别。
第二个原因仅仅是因为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编译器生成编译错误时...
这两种形式实际上并没有什么不同。没有性能问题,但需要注意以下几点:
第一种形式对于代码读者来说更易读,因为人们通常从左到右阅读代码。
第二种形式对于代码编写者来说更好,因为在Java中,=运算符用于赋值,而==运算符用于测试等效性,但是人们通常在if语句中使用=而不是==,通过第二种方法,开发人员会得到编译时错误,因为null不能在赋值语句的左侧使用。
新增内容
if (object = null) {
在Java中,将常量放在==的左侧并没有什么用处,因为Java要求if语句中的表达式评估为布尔值,所以除非常量是布尔值,否则无论你如何放置参数,都会得到编译错误。(如果是布尔值,你也不应该使用==...)
没有区别,和
if (foo == null)
enter code here
在编程中,首选的方法是将常量放在等号左边;然而在 C 语言中,您需要将常量放在左边,否则如果您使用 =
而不是 ==
将会出现错误。
null
)放在左边,这样做的想法是,如果你忘记了第二个等号,就会在编译时出现错误,否则它将是一个无效的赋值。 - Cᴏʀʏ"bar" = foo
vsfoo = "bar"
,我认为这也被称为 Yoda 风格。 - Moritz Roessler