我个人反对省略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();
}
我个人认为这段代码是:
我会将其设置为个人规则,仅 在控制流语句中使用它。
实际上,这意味着return
,break
和continue
。
此代码的两个替代版本如下所示。
备选方案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();
}
}
我想说他们都会让代码看起来更复杂,没有任何合理的理由。
答案 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 :(得分: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.
通过这种方式,您可以避免使用其他不必要的令牌,这些令牌确实可以为读者提供任何有用的功能。但它需要整个团队的纪律和承诺来手动格式化代码,或者应用正确的格式规则。在格式化规则失败时,我总是手工格式化我的代码以使其在这些情况下最具可读性。