java - 编程:IF风格
问题描述
让我们看看这个样本。
List <String> lst = getSome (); // returns null or a list
if (lst == null || lst.contains ("bla") == true)
{
// go on
这将起作用 - 空值被捕获。但这只是这种情况,因为我知道 if 项是从左到右评估的,并且如果结果不可更改(1 || x 始终为 1),则它不会被完全评估。至少这是我看到的,如果我让它运行的话。
但它乍一看并不明显,它可能取决于幕后的行为,并且可能会在某个时候改变。
问题是:这种良好的语言风格是否允许这样做?
解决方案
让我们看一下这个例子:
private static int personCount = 0;
public static void main(String args[]) {
boolean firstBool = false;
if(addPerson(firstBool) || addPerson(true)){
System.out.println("true");
}
System.out.println(personCount);
}
private static boolean addPerson(boolean b){
personCount++;
return b;
}
此代码输出2
,但如果您更改firstBool
为true
它将输出1
.
第二个函数有条件执行,它可能会让其他人错过这个函数不会总是第二次执行的事实。如果这个函数不会影响 if 子句的结果之外的任何内容,那么它会非常好,但否则最好避免编写这样的代码,或者至少添加关于它的注释。
短路是一种优化,当一个人试图理解一段代码的作用时,他不应该考虑所有在后台发生的优化。
编辑:&
您可以通过使用按位运算 ( and |
) 而不是逻辑运算 ( &&
and )来避免短路||
,这样您就可以确保这两个函数将始终被执行。