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

时间:2012-12-14 23:15:19

标签: java syntax

我正在开发一个样式为:

的java源代码
if (0 == var) {}
and 
if (null == someObj) {}

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

我应该把它重写为:

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

提前致谢!

4 个答案:

答案 0 :(得分:13)

完全有效:

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

着名的名为 yoda condition ,以防止意外使用单=代替==

我个人从未使用过它。但有些人喜欢它。这真的是一种品味问题。


然而,它在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条件,那就去吧!

答案 1 :(得分:4)

一般来说,写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为空,或者您正在比较primitives,因为对变量没有.equals()访问权限,所以无需检查空值。

if ( "CONSTANT" == null )

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

此类术语称为“ Yoda表达式”,因为与英语自然语言相比,它们是“向后”。

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

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

 if ("example".equals(input))

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

 if (input.equals("example"))

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