2010-08-05 17 views
6

Se provo a fare un .equals() su una stringa vuota in java, saranno gettati un'eccezione di puntatore nullo. Mi chiedo, se sto cercando di confrontare se una stringa è uguale a una stringa costante, posso effettuare le seguenti operazioni:Java è uguale a() ordinare

MY_CONSTANT_STRING.equals(aStringVariable) 

so che funzionerà, ma è questo codice appena davvero poveri?

risposta

16

Si tratta di un linguaggio standard di Java scherzosamente chiamato Yoda condition.

Personalmente preferisco per gestire il caso nulla esplicitamente, ma il modo in cui Yoda è molto utilizzato e qualsiasi programmatore Java con esperienza dovrebbe essere in grado di capire cosa sta succedendo immediatamente. Va bene da usare.

+0

+1 perche 'ho appena saputo del Maestro Yoda Condizioni grazie a questa risposta. http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined/2430307#2430307 –

4

Cosa hai va bene. È persino possibile utilizzare un letterale String.

if("value".equals(variable)) { 
    ... 

Se non ti piace questo, si può sempre esplicitamente verificare la presenza di null e l'uguaglianza, e combinare i due assegni con &&. Il cortocircuito dell'operatore farà in modo di non ottenere mai un NPE.

if((variable != null) && variable.equals("value")) { 
    ... 
+2

Le parentesi intorno alla variabile! = Null sono opzionali se si desidera ridurre il disordine. –

5

è questo codice solo davvero poveri?

No, questo è il modo in cui molte persone codificano l'istruzione per evitare NPE.

0

No, di solito è fatto per evitare NPE. Tuttavia, di solito preferisco fare un controllo esplicito per null.

1

Manterrei il codice "CONSTANT.equals (possibleNull)" senza il test Null solo se è una condizione normale che la variabile possa essere nullo, ad esempio perché è appena uscita da una mappa delle proprietà.

Allo stesso modo si può ottenere via con non controllare per nulla in instanceof verifiche - come:

Food dinner = map.get("dinner"); 
if (dinner instanceof Soup) { 
     ((Soup)blah).eat(); 
} // We don't care if it is a Fish or null 

Ma se davvero non si aspettava nulla, si dovrebbe esplicitamente verificare che in un caso-test separato, e gestirlo in modo appropriato. In genere è meglio prendere questi errori di dati in anticipo piuttosto che dopo.

0

Se siete preoccupati per la qualità del codice, scrivere una classe di supporto che si occupa di test di uguaglianza:

public class ObjectHelper { 
    public static boolean testEquality(Object o1, Object o2) { 
     if (o1 == null && o2 == null) return true; 
     if (o1 == null) return false; 
     return o1.equalts(o2); 
    } 
} 

Quindi utilizzare in questo modo:

if (ObjectHelper.testEquality(aStringVariable, My_CONSTANT_STRING)) 

vostra cosiddetta costante MIGHT smette di essere costante. Potrebbe essere letto da un file di configurazione in futuro.

+0

Java 7 ha un metodo di supporto integrato ['java.util.Objects.equals (..)'] (http://docs.oracle.com/javase/7/docs/api/java/util/Objects.html# equals (java.lang.Object,% 20java.lang.Object)) che fa proprio questo. –