2010-07-13 5 views
9

C'è un modo in cui posso ottenere Eclipse per evidenziare l'uso dell'operatore == per verificare l'uguaglianza di stringa? Continuo a utilizzarlo per errore invece di chiamare .equals().Evidenzia quando l'operatore di uguaglianza (==) viene utilizzato per confronti di stringhe in Eclipse

Mi piacerebbe davvero farlo in un avvertimento e richiedere un'annotazione @SuppressWarnings per rimuoverlo, nel caso che si verifichi ancora che io in realtà voglio confrontare le stringhe per l'uguaglianza degli oggetti.

Esistono strumenti che posso utilizzare per interrompere questa cattiva abitudine in fase di modifica?

risposta

10

Utilizzare uno strumento static analysis come FindBugs, PMD o CheckStyle.

Non ci sono plugin Eclipse per ciascuno, insieme a compiti Ant, plugin Maven, ecc

Ognuno di questi ha regole relative alla stringa uguaglianza (Findbugs rule, PMD rule, Checkstyle rule).

+1

Definirei definitivamente l'utilizzo di Findbugs per Eclipse .... è stata una manna dal cielo per aver catturato questi piccoli problemi di codifica! – mikera

+1

sono tutti ottimi, specialmente se usati insieme su un server di integrazione continuo come hudson (a patto che le persone guardino effettivamente ai risultati :-)) –

+1

sai se qualcuno di questi viene eseguito in fase di modifica? ne stiamo già eseguendo un paio come parte di build notturne e generando file di report. Voglio qualcosa che fa l'errore/avvertimento evidenziando proprio mentre digito. –

5

La risposta ovvia alla domanda has already been given, ma qui è un avviso che non è una risposta diretta: obj.equals può anche fallire se obj è nullo. Così spesso si deve usare il codice come questo:

if(mystr1 != null && mystr1.equals(mystr2)) 

perché questo

if(mystr1.equals(mystr2)) 

sarebbe fallire con un NullPointerException se mystr1 è nullo.

È per questo che, quando la stringa di confronto è un noto costante, la seguente sintassi è spesso usato:

if("ABCDEF".equals(mystr1)) 

piuttosto che

if(mystr1.equals("ABCDEF")) 

Per questo motivo, molte librerie (come apache commons/lang) fornire funzioni di utilità che combinano questi controlli:

// this is the definition of org.apache.commons.lang.StringUtils.equals(String, String) 
public static boolean equals(String str1, String str2) { 
    return str1 == null ? str2 == null : str1.equals(str2); 
} 

// this is the definition of org.apache.commons.lang.ObjectUtils.equals(Object, Object) 
public static boolean equals(Object object1, Object object2) { 
    if (object1 == object2) { 
     return true; 
    } 
    if ((object1 == null) || (object2 == null)) { 
     return false; 
    } 
    return object1.equals(object2); 
} 

L'utilizzo di questi metodi è solitamente più sicuro degli uguali, a meno che non si sia sicuri che uno dei due oggetti non sia nullo

1

Non sono d'accordo con le risposte precedenti: si tratta di un bug in eclissi e puoi votarlo qui: https://bugs.eclipse.org/bugs/show_bug.cgi?id=39095.

Eclipse può benissimo avvisare quando si confrontano stringhe con == in quanto raramente è ciò che si desiderava (o cosa voleva l'autore originale).

Problemi correlati