6

我正在研究具有以下风格的java源代码:

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

或者

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

我应该将其重写为:

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

?

提前致谢!。

4

4 回答 4

13

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

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

它被称为著名的yoda 条件,以防止意外使用 single=代替==.

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


但是,它在 Java 中没有用。因为,这样一个意外的错字在编译时就被发现了。

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

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

因为赋值操作在 Java 中不会产生布尔值。但是,在 C/C++ 等语言中,上述内容是有效的,如果未启用警告,编译器不会给出错误。if在 C/C++ 中,上述条件将始终评估为假 (0)。所以它可能会被忽视并在运行时给出意想不到的结果。

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

warning: suggest parentheses around assignment used as truth value

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

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

于 2012-12-14T23:17:10.280 回答
4

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

最好写n == 0。但它是完全一样的。但是读起来更好。

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

if (value = 42)

产生编译错误。value = 42产生一个在 javaint中不是有效输入的 an 。if但在C.

比较使用constant左侧的 是一种常见的最佳实践。但前提是使用 Object equals 方法。

if ("CONSTANT".equals(myString))

ifmyString为 null 或者您正在比较primitives,因为无法.equals()访问该变量,因此检查 null 没有意义。

if ( "CONSTANT" == null )

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

于 2012-12-14T23:17:31.610 回答
0

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

我不认为分配有什么好处——好的代码审计工具可以捕获这些类型的错误,并且大多数应该已经被更严格的 Java 编译器捕获(使用=而不是==C 中的常见错字!)

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

 if ("example".equals(input))

不能碰上a NullPointerException,而更“自然”

 if (input.equals("example"))

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

于 2012-12-14T23:22:08.077 回答
0

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

于 2012-12-14T23:17:28.237 回答