问题描述
通常很容易在程序中发现不必要的括号,但我对在 if
语句中使用括号有点困惑。
public class TestClass {
void method(String sectionName) {
if ("Content".equals(sectionName) || "Overview".equals(sectionName)
// suppression list
|| (!"AbbreviationAsWordInName".equals(sectionName)
&& !"AbstractClassName".equals(sectionName)
)) {
System.out.println();
}
}
}
我觉得第 5 行(!"AbbreviationAsWordInName"
之前)的括号是不必要的。现在的问题是,通常我可以测试代码然后得出结论,但现在我正在修复开源程序中的一些错误,而该插件又被许多其他程序使用,所以我很少感到困惑。
更多示例-
if (active == (forward ? past : future) &&
((increasing && switchOnIncrease) || (!increasing && switchOnDecrease)))
在上面的例子中,我觉得第 2 行有不必要的括号。
另一个例子-
else if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) {}
我认为上面的例子中有额外的括号,应该像-
else if (c >= '0' && c <= '9' || c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F') {}
请帮我找到一个可靠的解决方案。
解决方法
如果将此 if 语句格式化为一行,您将更清楚地了解语句中实际发生的情况。
if ("Content".equals(sectionName) || "Overview".equals(sectionName) || (!"AbbreviationAsWordInName".equals(sectionName) && "AbstractClassName".equals(sectionName) )) {
现在,如果您查看它并将其分解为多个部分,您会发现只需要满足 3 个条件。
- 第一。
if ("Content".equals(sectionName))
- 第二。
if ("Overview".equals(sectionName))
- 第三。
if (!"AbbreviationAsWordInName".equals(sectionName) && "AbstractClassName".equals(sectionName) )
虽然在 ||
之后和关闭括号之前将括号放在第三个条件中可能是正确的,但代码将作为单个条件进行评估 - 对于任何查看第三个条件的人来说,这些“冗余” ' 括号实际上提供了一些关于构成此条件的一部分的清晰性。毫无疑问,这两个 "AbbreviationAsWordInName".equals(sectionName)
和 "AbstractClassName".equals(sectionName)
必须相遇才能评估为真。
如果省略这个括号,人们可能会混淆这两个是否构成单个条件的一部分。
另外值得一提的是,在逻辑表达式中存在一定的优先级,例如:src
就像算术运算符一样,逻辑运算符也有一个运算顺序:首先是 NOT,然后是 AND,然后是 OR。如果您在实际需要的地方(甚至没有注意到)在逻辑表达式中省略括号,这可能会导致逻辑上不同的表达式。始终使用括号以确保计算机按预期顺序评估条件。
我想在一天结束时(至少在我看来)最好将逻辑条件清楚地分开,这样它们更容易理解,而且额外的括号,就像缩进、空格和其他样式标准一样,有助于视觉上的组织以合乎逻辑的方式编写代码。