这可能只是一个样式问题,但我正在阅读一本Java编码书('Programming Android')并且编写者在变量方法之前首先声明为null,这是我不熟悉的一种做法。例如:
if (null == foo) {
//code here
}
或
if (null != foo) {
//code here
}
而不是
if (foo == null) {
//code here
}
我看不出顺序如何在语义上/语法上产生差异,或者我在这里错了?真的很好奇。
答案 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编译器会生成编译错误.. 两种形式之间没有什么不同。没有性能问题,但有以下注意事项:
第一种形式对于代码阅读器是可读的,因为人们通常会阅读 代码从左到右。
第二种形式对于代码编写器更好,因为在java = operator中 对于赋值和==运算符是为了测试等效,但是人 通常在if语句中使用=而不是==,第二个approch 开发人员获取Compile-Time-Error因为null无法使用 赋值语句的左侧。
<强> ADDED 强>
if (object = null) {
将常量放在==左侧的惯例不是 在Java中真正有用,因为Java要求表达式为if 求值为布尔值,所以除非常量是布尔值, 你输入参数的方式都会出现编译错误。 (和 如果它是布尔值,你不应该使用==反正...)
答案 4 :(得分:1)
没有区别,
if (foo == null)
enter code here
是首选方式;但是在C中,你会将常量放在左边,因为如果使用=
而不是==