它是否适合该声明。 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
不是布尔表达式。