它是否适合该声明。 java中的if(0!= expression或variable){}?

我正在研究具有以下样式的java源代码:

if (0 == var) {} and if (null == someObj) {} 

要么

 if (0 != var) {} and if (null != someObj) {} 

我应该把它重写为:

 if (var == 0) {} and if (someObj == null) {} 

提前致谢!。

拥有以下内容是完全有效的:

 if (0 == var) {} and if (null == someObj) {} 

它被称为yoda条件,以防止意外使用单=代替==

我个人从来没用过它。 但有些人喜欢它。 这真的是品味问题。


但是,它在Java中没用。 因为,这样的意外拼写错误是在编译时捕获的。

以下将在Java中给出编译时错误。

 if( var = 0 ) { //Some code } 

因为赋值操作不会在Java中产生布尔值。 但是,在C / C ++等语言中,上述内容有效,如果未启用警告,编译器将不会出错。 上面的if条件总是在C / C ++中求值为false(0)。 因此,它可能会被忽视并在运行时产生意外结果。

在GCC中,启用所有警告后,它将在C或C ++中给出上述警告:

 warning: suggest parentheses around assignment used as truth value 

所以这在C / C ++中可能没有多大用处,因为预计会编译所有警告并修复所有警告。 正如我之前所说,这是个人选择而没有任何区别。

因此, if ( 0 == var){}是一个有效的语法,并且与if (var == 0) {} ,如果您更喜欢Yoda条件,那就去吧!

一般写0 == n称为yoda condition 。 因为如果你大声说出来,你会说if zero equals my var

最好写n == 0 。 但它完全一样。 但它阅读得更好。

条件的一些优点不适用于java。

 if (value = 42) 

产生编译错误。 value = 42产生一个int ,它不是java中if的有效输入。 但在C完全合法。

使用左侧的constant进行比较是一种常见的最佳实践。 但只有使用Object equals方法。

 if ("CONSTANT".equals(myString)) 

如果myString为null或者你正在比较primitives因为没有.equals()访问变量,所以没有必要检查null。

 if ( "CONSTANT" == null ) 

虽然只是我的意见,但这种好处只是易读性。

这种类型的术语被称为“ 尤达表达 ”,因为与英语自然语言相比,它们是“向后”的。

我认为它不会带来任务 – 良好的代码审计工具可以捕获这些类型的错误,而且大多数应该已经被更严格的Java编译器捕获(使用=而不是==是C中常见的拼写错误!)

但是,在使用compareTo方法时,需要考虑null值。

  if ("example".equals(input)) 

无法遇到NullPointerException ,而更“自然”

  if (input.equals("example")) 

可以,并需要额外检查null值。

第一种风格是有的首选,因为偶然地说var = null而不是var == null将是一个很难在C和C ++等语言中捕获的错误,但是null = var很容易被捕获,因为它不会编译。 如注释中所述,这不适用于Java,因为null = var不是布尔表达式。