PMD UselessParentheses 违规

PMD UselessParentheses violation

我有以下Java方法:

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

PMD 投诉此代码 "UselessParentheses" 违规。

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

在阅读了操作员首选项、代码行和 PMD 警告之后,这可能是像

这样应用优先级的罕见情况之一
PMD complains on this code with a useless (parenthesis warning)

而不是

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

你的代码是正确的,括号也不是多余的。删除它们会使代码的可读性降低,并且它们中的每一个都是必需的。事实上,这整个问题都值得 xkcd comic

此代码中没有不必要的括号,如您所见运行 this:

        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