2016-01-20 109 views
5

我有以下的Java方法:PMD UselessParentheses违反

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

PMD对这个代码抱怨与 “UselessParentheses” 违规。

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

+0

在该块中删除括号:(字节[0]&0xff的) – eg04lt3r

+10

重要的是,即使有一个多余的对括号(我看不到任何),代码将远远小于没有它可读。这是写的方式确切地表达了你的逻辑意味着要做的事情。 – biziclop

+0

对不起,我的错误是删除(bytes [0]&0xff)中的括号。或者,您可以将PMD的压制警告添加到此方法。 – eg04lt3r

回答

5

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

 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 
+1

仅供参考:已通过PMD 5.3.5修正([bug#1407](https://sourceforge.net/p/pmd/bugs/1407))。所以 - 更新PMD应该摆脱这种错误的违规行为。 – adangel

3

仔细阅读操作偏好,代码行和PMD的警告后,这可能是一个罕见的情况下,优先级是指像

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

而不是

PMD complains on this code with a (useless parenthesis) warning. 
施加一个

你的代码是正确的,括号不是多余的。删除它们会使代码不易读,并且每个代码都是需要的。事实上,这整个问题是值得的xkcd comic