首页 > 解决方案 > 编程:IF风格

问题描述

让我们看看这个样本。

List <String> lst = getSome ();  // returns null or a list
if (lst == null || lst.contains ("bla") == true)
{
   // go on

这将起作用 - 空值被捕获。但这只是这种情况,因为我知道 if 项是从左到右评估的,并且如果结果不可更改(1 || x 始终为 1),则它不会被完全评估。至少这是我看到的,如果我让它运行的话。

但它乍一看并不明显,它可能取决于幕后的行为,并且可能会在某个时候改变。

问题是:这种良好的语言风格是否允许这样做?

标签: java

解决方案


让我们看一下这个例子:

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,但如果您更改firstBooltrue它将输出1.

第二个函数有条件执行,它可能会让其他人错过这个函数不会总是第二次执行的事实。如果这个函数不会影响 if 子句的结果之外的任何内容,那么它会非常好,但否则最好避免编写这样的代码,或者至少添加关于它的注释。

短路是一种优化,当一个人试图理解一段代码的作用时,他不应该考虑所有在后台发生的优化。

编辑:&您可以通过使用按位运算 ( and |) 而不是逻辑运算 ( &&and )来避免短路||,这样您就可以确保这两个函数将始终被执行。


推荐阅读