在编写if语句时省略else的效果是什么?

时间:2013-08-05 05:07:27

标签: java coding-style

我从前谷歌员工的博客那里得到了一些东西。他说谷歌员工曾经有过像if条件的约定:

if (condition) {
    return x;
} else {
    return y;
}

但后来谷歌内部改变了这样:

if (condition) {
    return x;
}
return y;

似乎SO上有类似或重复的问题(例如this one),我也检查了Oracle official Java Code Conventions。我只是对它们之间的差异感到好奇,即使它可以忽略不计。

我不是在寻找意见或者人们喜欢什么,而是在这里是否存在任何实际的,可辨别的差异,或者它是否只是风格问题。

5 个答案:

答案 0 :(得分:2)

我个人想选择

if (condition) {
    return x;
} else {
    return y;
}

无论是否有大括号,这对我来说都更具可读性。这些是return语句,所以它可能没什么区别。但是我们可以说它们只是语句,如下例所示:

if (condition){
    //some statements
} else {
    //some related statements
}

此代码随着时间的推移可能会导致类似下面的内容

if (condition){
    //some statements
} else {
    //some related statements
}
//some totally unrelated statements

在这种情况下,您可以清楚地区分哪些是受条件影响的那些。将来,当你需要重构它时,它可能会更容易。

正如您所看到的,它只是个人品味。我建议您咨询您的主管/架构师/同事,看看他们是否有偏好。作为一个拇指规则,最好选择团队的偏好而不是你自己的偏好。

答案 1 :(得分:0)

这是更好的代码格式化建议之一。

如果您使用的是Eclipse,则可以在“首选项”中启用此警告。 它会让你知道这些代码块,其中有不必要的其他条件。

答案 2 :(得分:0)

从功能上讲,没有区别。就个人而言,我更喜欢第二个,因为我不喜欢添加额外的东西,如果它在程序中没有做任何事情。

从技术上讲,在第二个片段中,你甚至不需要大括号,但是我建议他们在那里提高代码的可读性,并保持快速扫描理解。

我不知道代码将如何转换为JBC,但如果else实际执行了更多指令而不是其他,我不会感到惊讶。

如果你做的不仅仅是简单的回复,我建议使用带括号的else,否则,只需遵循代码片段#2的结构。

答案 3 :(得分:0)

两种情况下的条件得到评估没有区别(功能和性能)。 区别在于代码结构和不同人/组织适用的格式化实践。

有些人认为else更详细或更明确。

PMDFindbugs具有else冗余的代码质量规则(警告级别)。因此,如果您启用了这些代码分析工具的默认模板,则警告报告将包含此类片段/方法调用。

On有多个return语句,建议(PMD和FindBugs中的类似设置)避免,因为它会降低代码的可读性。对于像你发布的更简单的代码,它看起来没有两个return,但考虑到复杂的条件逻辑,在不同条件下返回不同的值,理解代码并不容易。 更好(理想)有一些return陈述,有些人认为只有一个:

int data = DEFAULT;
if(condition) {
  data = XYZ;
} else if(condition) {
  data = DDD;
}
return data;

答案 4 :(得分:0)

代码逻辑没有区别,我相信在两种情况下都可以编译成完全相同的字节码。它更多的是个人偏好。以下是支持前一种方法的一系列因素:

  1. 第一个例子中没有“第三个选项”。虽然Java编译器足够智能来检测它,但是函数无法在returnif块内完成其执行(else),第一个代码看起来可能有是这样的。特别是当您的代码增长时,返回状态网络不再那么清晰可见。
  2. 限制打开的花括号的数量 - 这在我看来更为重要。您应该始终尝试将嵌套块的数量({...})限制到最小 - 代码几乎总是更具可读性:

    for (...) {
        if (...) {
            if (...) {
                // this sucks, 3 levels of indention
            }
        }
    }
    
    for () {
        if (!...) {
            continue;
        }
    
        if (!...) {
            continue;
        }
    
        // maybe there's more code but it's much easier to read and maintain
    }