2016-01-20 17 views
5

Ho il seguente metodo Java:PMD UselessParentheses violazione

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

PMD si lamenta su questo codice con la violazione "UselessParentheses".

Ho esaminato operator precentence rules e ancora non vedo parentesi ridondanti in quel codice. Mi sto perdendo qualcosa?

+0

Rimuovi parentesi in questo blocco: (byte [0] e 0xff) – eg04lt3r

+10

Fondamentalmente, anche se c'era una coppia di parentesi superflua (non riesco a vedere alcuna), il codice sarebbe molto meno leggibile senza di essa. Il modo in cui questo è scritto trasmette esattamente ciò che la tua logica è destinata a fare. – biziclop

+0

Mi dispiace, errore mio, elimina parentesi in (byte [0] e 0xff). Oppure puoi aggiungere l'avviso di soppressione per PMD a questo metodo. – eg04lt3r

risposta

5

Non c'è parentesi inutili in questo codice, come si può vedere se si esegue questo:

 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)); 

Inoltre, a volte è effettivamente un bene per aggiungere parentesi in più per leggibilità. Ad esempio:

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

FYI: questo problema è stato risolto con PMD 5.3.5 ([bug # 1407] (https://sourceforge.net/p/pmd/bugs/1407)). Quindi, l'aggiornamento di PMD dovrebbe eliminare questa falsa violazione. – adangel

3

Dopo aver letto le preferenze dell'operatore, la riga di codice, e l'avviso PMD, questo è probabilmente uno di quei rari casi in cui la precedenza è destinato ad essere applicato come

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

piuttosto che

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

Il codice è giusto e la parentesi non è superflua. Rimuovendoli renderebbe il codice meno leggibile e ognuno di essi è necessario. In realtà, tutta la questione è degna di un xkcd comic

Problemi correlati