在单行上严格省略花括号是否正确?

时间:2014-04-14 10:35:42

标签: java if-statement coding-style

我个人反对省略if-else-statements的花括号,我完全明白为什么要避免它。

但是现在我已经遇到了一个有趣的用例,示例代码在这里:

public <E extends RuntimeException> void throwOnFail(final boolean result, final Supplier<E> exceptionSupplier) throws E {
    Objects.requireNonNull(exceptionSupplier);
    if (result) return;
    throw exceptionSupplier.get();
}

我个人认为这段代码是:

  • 尽可能简洁,下面会显示其他变体。
  • 不容易受到添加一行会改变代码逻辑的问题的影响。

我会将其设置为个人规则,仅 在控制流语句中使用它。
实际上,这意味着returnbreakcontinue

此代码的两个替代版本如下所示。

备选方案1

public <E extends RuntimeException> void throwOnFail(final boolean result, final Supplier<E> exceptionSupplier) throws E {
    Objects.requireNonNull(exceptionSupplier);
    if (result) {
        return;
    }
    throw exceptionSupplier.get();
}

备选方案2

public <E extends RuntimeException> void throwOnFail(final boolean result, final Supplier<E> exceptionSupplier) throws E {
    Objects.requireNonNull(exceptionSupplier);
    if (!result) {
        throw exceptionSupplier.get();
    }
}

我想说他们都会让代码看起来更复杂,没有任何合理的理由。

3 个答案:

答案 0 :(得分:2)

  

在单行上严格省略花括号是否正确?

没有任何硬性规则。但考虑到可用性案例,我总是使用大括号。它使代码更具可读性,对于初级开发人员来说,它易于理解。同样,它纯粹是个人/公司(代码标准)的选择。

再次在您的替代方案中,我选择 Alternative2

public <E extends RuntimeException> void throwOnFail(final boolean result, final Supplier<E> exceptionSupplier) throws E {
    Objects.requireNonNull(exceptionSupplier);
    if (!result) {
        throw exceptionSupplier.get();
    }
}

<强>为什么吗

  1. 更简洁
  2. 行数较少
  3. 逻辑上直截了当

答案 1 :(得分:1)

我会选择备选方案2

即使省略花括号可能会使代码更漂亮,更简洁,但替代2是最难解释的。

如果某人快速浏览一下这个函数,那么很可能会错过返回语句,因为它不在自己的行中,在备选方案2中更难以犯这个错误。

答案 2 :(得分:0)

我考虑在任何地方添加curly braces,其中一个正文可以由多个语句defensive programming组成,这可以防止出现细微的逻辑错误。但是如果您的团队重视:

  • 高度可读的代码
  • 手工格式化代码

然后您就可以使用另一条规则,我将其应用于我的源代码:

omit `curly braces` when the single statement of a body occurs at the same line.

通过这种方式,您可以避免使用其他不必要的令牌,这些令牌确实可以为读者提供任何有用的功能。但它需要整个团队的纪律和承诺来手动格式化代码,或者应用正确的格式规则。在格式化规则失败时,我总是手工格式化我的代码以使其在这些情况下最具可读性。