【问题标题】:PMD UselessParentheses violationPMD 无用括号违规
【发布时间】:2016-01-20 21:46:25
【问题描述】:

我有以下 Java 方法:

private int calculate() {
    return (bytes[0] & 0xff) + ((bytes[1] & 0xff) << 8);
}

PMD 抱怨此代码违反“UselessParentheses”。

我已经查看了operator precentence rules,但我仍然没有在该代码中看到多余的括号。我错过了什么吗?

【问题讨论】:

  • 删除此块中的括号:(bytes[0] & 0xff)
  • 至关重要的是,即使有一对多余的括号(我看不到任何括号),如果没有它,代码的可读性也会大大降低。这种写法准确地表达了你的逻辑是什么意思。
  • 对不起,我的错误,删除 (bytes[0] & 0xff) 中的括号。或者您可以在此方法中添加 PMD 的抑制警告。
  • @eg04lt3r + 也优先于&amp;,bytes[0] &amp; 0xff + ... 等价于bytes[0] &amp; (0xff + ...),而不是(bytes[0] &amp; 0xff) + ...。

标签: java pmd


【解决方案1】:

这段代码中没有不必要的括号,如果你运行它就可以看到:

        byte [] bytes = new byte[] {1,2};

        System.out.println( (bytes[0] & 0xff) + ((bytes[1] & 0xff) << 8));
        System.out.println( bytes[0] & 0xff + ((bytes[1] & 0xff) << 8));
        System.out.println( (bytes[0] & 0xff) + (bytes[1] & 0xff) << 8);
        System.out.println( (bytes[0] & 0xff) + (bytes[1] & 0xff << 8));

此外,有时添加额外的括号以提高可读性实际上会很好。例如:

int i = x << y + z;   // this will shift x by y+z bits
int j = x << (y + z); // equivalent, but more readable

【讨论】:

  • 仅供参考:这已通过 PMD 5.3.5 (bug #1407) 修复。所以 - 更新 PMD 应该可以消除这种错误的违规行为。
【解决方案2】:

在阅读了操作员首选项、代码行和 PMD 警告之后,这可能是优先级应用的罕见情况之一

PMD complains on this code with a useless (parenthesis warning)

而不是

PMD complains on this code with a (useless parenthesis) warning.

您的代码是正确的,括号不是多余的。删除它们会降低代码的可读性,并且需要它们中的每一个。其实这整期都值得xkcd comic

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多