2010-06-23 7 views
8

devoQual è la giusta posizione dei letterali in String Comparison?

if (localName.equals("TaxName")) { 

ma PMD dice

Position literals first in String comparisons 
+1

Beh, se PMD lamenta letterali di essere a destra , Non penso che tu abbia molte altre scelte che metterle a sinistra (aka [condizione yoda] (http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined/2430307#2430307) stile) :) –

risposta

23

"TaxName".equals(localName) è meglio come se localName è nullo non sarà possibile ottenere un'eccezione di puntatore nullo.

+4

Questo è solo meglio se vuoi permetterlo. Personalmente, non riesco a ricordare una situazione del genere in cui non si trattasse di un errore nel mio codice che volevo catturare il prima possibile. – Davor

+0

regex per sostituire quelli: '([a-zA-Z] [^] +) \. Equals \ ((" [^ "] *") \) ' Sostituisci con:' \ 2.equals (\ 1) ' – Kuronashi

5

preferisco letterali prima posizione, vale a dire:

if ("TaxName".equals(localName)) { ... 

In questo modo si fa un confronto giusto per il caso di null, invece di ottenere NullPointerException.

7

PMD dovrebbe anche dirti perché genera questo avviso. Dal the rules documentation sul sito PMD:

letterali prima posizione in confronti String - in questo modo se la stringa è nulla non sarà possibile ottenere un NullPointerException, sarà solo restituiscono falso.

+1

In alcuni casi, se una variabile è nullo, il codice dovrebbe considerarlo non uguale a una stringa, in altri casi indica un problema e più rapidamente il problema viene contrassegnato, meglio è. Nell'ultima situazione,' variabile .equals ("literal") 'è migliore, poiché verrà intercettato se la variabile è nullo – supercat

2

Personalmente, questo non ha senso per me. Se il codice cattura una NullPointerException, allora ha funzionato che non dovrai fare più tardi. Se localName finisce con null, e questo causa un problema in seguito, sarà più difficile da rintracciare. Non modificare il codice per rendere felice il compilatore. Se il tuo codice genera una NullPointerException, allora ti verrà salvato il tempo di debugging più tardi.

+0

Non sono affatto d'accordo e preferisco sicuramente scrivere' CONSTANT.equals (variable) 'piuttosto che eseguire un controllo' null' preliminare. –

+0

If localName è nullo e si prova ad usarlo in seguito si otterrà esattamente lo stesso effetto del codice originale, cioè un NPE. Ma, più significativamente, si dovrebbe sempre rendere il compilatore felice - sa cosa sta facendo. andando nelle impostazioni del compilatore per il tuo IDE di scelta e aggiornare tutti quelli c avvisi del compilatore in errori. – CurtainDog

+1

@CurtainDog l'aggiornamento degli avvisi del compilatore negli errori bloccherebbe effettivamente la produttività della mia azienda per un anno. Sono sicuro che il 90% delle persone su SO sarebbe d'accordo. Non sto dicendo che in linea di principio non hai ragione, perché quegli avvertimenti si trasformano in bug troppo spesso, sto solo dicendo che è più facile a dirsi che a farsi. – corsiKa

-1

Per evitare questo avvertimento, una soluzione più semplice è nullpointers controllo prima, wich si raccomanda in ogni oggetto riusciamo, non solo in questo caso:

if (localName!=null && localName.equals("TaxName")) { 
    ... 
} 
Problemi correlati