4

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

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

或者

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

代替

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

我看不出这个顺序在语义/句法上会有什么不同,还是我错了?真的只是好奇。

4

5 回答 5

11

这可能是 C/C++ 遗留下来的习惯。在 C 语言中,您会将常量放在左侧,因为如果您输入错误=而不是==会出现错误,因为您无法将某些内容分配给常量。在 Java 中,这是不必要的,因为if (foo = null)还会给出一个错误,即对象引用不是布尔值。

于 2013-09-21T21:01:18.283 回答
5

这是 C/C++ 的保留。将值放在 == 运算符的左侧是有好处的,以防您不小心使用了赋值 = 运算符。C 编译器会将 14 = var 捕获为错误,但 var = 14 将编译,当您打算键入 var == 14 时。在 Java 中没有太多理由这样做,但有些人仍然这样做。

于 2013-09-21T21:02:15.000 回答
4

有时 order 可以使您免受空指针异常的影响,例如,如果String变量来自某个地方并且您像这样比较它:

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

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

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

那么您不仅可以实现您的目的,而且还可以避免空指针异常,以防Stringfoo 是null

于 2013-09-21T21:04:13.423 回答
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 语句中使用 = 而不是 ==,因为第二个方法开发人员得到 Compile-Time-Error 因为 null不能在赋值语句的左侧使用。

添加

if (object = null) {

将常量放在 == 左侧的约定在 Java 中并不是很有用,因为 Java 要求 if 中的表达式计算为布尔值,所以除非常量是布尔值,否则会出现编译错误无论哪种方式,您都可以提出论点。(如果它是一个布尔值,你不应该使用 == 反正......)

于 2013-09-21T21:05:44.853 回答
1

没有区别,而且

if (foo == null)
    enter code here

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

于 2013-09-21T21:04:52.017 回答