2016-01-20 106 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