2015-06-18 12 views
6

Di seguito confronta due valori enum utilizzando ==:Perché confrontare le enumerazioni usando == causa un avviso PMD?

MyEnum enum1 = blah();  // could return null 
MyEnum enum2 = blahblah() // could return null 
if (enum1 == enum2) { 
    // ... 
} 

Ma PMD dà un avvertimento CompareObjectsWithEquals sulla linea 3:

Usa equivale() per confrontare i riferimenti agli oggetti

Non è sicuro Capisco lo source code for this check ma ho pensato che fosse OK confrontare due enumerazioni usando == quindi mi chiedo se il mio codice potrebbe essere migliorato o il ck non è corretto.

+2

E 'OK. Potrebbe essere rilevante: http://sourceforge.net/p/pmd/bugs/1028/ – MadConan

risposta

18

questo è davvero accettato come bug:

Tuttavia, sembra essere difficile da catturare tutti i casi possibili (citazione dal più recente bug):

Quello è un po 'complicato, come per determinare, se un tipo è a Enum, abbiamo bisogno di risoluzione del tipo.

Sono stato in grado di regolare la regola da verificare, se il tipo delle variabili è un Enum. Funziona solo se i tipi Enum si trovano su "auxclasspath" di pmd, in modo che la risoluzione del tipo possa trovarlo.

L'esempio in isolamento attiverebbe comunque questo falso positivo, poiché PMD non sa cosa sia ProcessingStatus. L'ho verificato con java.math.RoundingMode, che è sempre sul classpath e sarà risolto .

("Il tuo esempio" si riferisce all'autore biglietto, non il PO su Stack Overflow)

Il tuo caso potenza lavoro con PMD 5, la fonte si è collegato appartiene alla PMD 4.

Aggiornamento: il current source contiene l'assegno aggiuntivo per le enumerazioni:

// skip, if it is an enum 
if (type0.getType() != null && type0.getType().equals(type1.getType()) && type0.getType().isEnum()) { 
     return data; 
} 
4

Va bene utilizzare .equals(), perché under the hoods, ciò che accade è che le istanze vengono confrontate con ==.

public final boolean equals(Object other) { 
    return this==other; 
} 

Si noti che questa implementazione di .equals() è final, che significa che non è possibile ignorare che nel vostro enum.

+0

Grazie - ma una delle enumerazioni potrebbe essere nullo quindi non si vuole rischiare una NullPointerException. –

+0

Quindi dovrai aggiungere un assegno. Oppure utilizzare il '' 10 'di Java8 opzionale. :) –

+6

Oppure attenersi a 'enum1 == enum2' e ignorare questo avviso PMD. – stuXnet