【问题标题】:Recognizing Redundant parenthesis识别冗余括号
【发布时间】:2021-02-20 11:44:12
【问题描述】:

通常很容易在您的程序中发现不必要的括号,但我对在 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') {}

请帮我提供一个可靠的解决方案。

【问题讨论】:

  • 如果你想清除它,你必须看看这个:docs.oracle.com/javase/tutorial/java/nutsandbolts/… 并记住运算符的优先级。
  • 括号越多越好。为了清楚起见,请保留它们。
  • 如果有多余的括号,代码将不会通过 CI。
  • @JayC667 而且这个功能是可配置的,你可以根据需要抑制一些功能。
  • 当您检查优先级时,&amp;&amp; 首先出现,因此您不需要括号。要做的就是做一个测试所有条件的测试。

标签: java parentheses


【解决方案1】:

如果您将此 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) &amp;&amp; "AbstractClassName".equals(sectionName) )

虽然在 || 之后和右括号之前将括号排除在第三个条件下可能是正确的,但代码将作为单个条件进行评估 - 对于任何查看第三个条件的人来说,这些“冗余”括号实际上提供了一些关于什么构成这种情况的一部分的清晰度。毫无疑问,这两个"AbbreviationAsWordInName".equals(sectionName) 和"AbstractClassName".equals(sectionName) 都必须满足才能评估为真。

如果您省略了这个括号,人们可能会对这两者是否构成单个条件的一部分感到困惑。

另外值得一提的是,逻辑表达式中存在一定程度的优先级,如下所示:src

就像算术运算符一样,逻辑运算符也有一个运算顺序:首先是 NOT,然后是 AND,然后是 OR。如果您在实际需要括号的地方省略了逻辑表达式中的括号(甚至没有注意到它),这可能会导致逻辑上不同的表达式。始终使用括号来确保计算机以预期的顺序评估条件。

我想在一天结束时(至少在我看来)最好清楚地分离逻辑条件,这样它们更容易理解,而且额外的括号,就像缩进、空白和其他样式标准一样,有助于直观地组织以合乎逻辑的方式编写代码。

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多