2010-08-05 13 views
6

Si trato de hacer un .equals() en una cadena nula en java, se lanzará una excepción de puntero nulo. Me pregunto, si yo estoy tratando de comparar si una cadena es igual a alguna cadena constante, puedo hacer lo siguiente:Java equals() ordenando

MY_CONSTANT_STRING.equals(aStringVariable) 

Sé que va a funcionar, pero es el código realmente pobres?

Respuesta

16

Esta es una expresión idiomática de Java llamada en broma Yoda condition.

Personalmente prefiero manejar el caso nulo explícitamente, pero el modo Yoda se usa mucho y cualquier programador experimentado en Java debería ser capaz de entender lo que está sucediendo inmediatamente. Está bien de usar.

+0

+1 porque acabo de enterarme de las condiciones de la Maestra Yoda gracias a esta respuesta. http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined/2430307#2430307 –

4

Lo que tienes está bien. Incluso es posible usar un literal String.

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

Si no te gusta eso, siempre se puede comprobar de forma explícita para null y la igualdad, y combinar los dos cheques con &&. El cortocircuito del operador se asegurará de que nunca obtenga un NPE.

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

Los paréntesis alrededor de la variable! = Null son opcionales si desea reducir el desorden. –

5

es esta realmente mal código?

No, esta es la forma en que muchas personas codificarían la declaración para evitar NPE.

0

No, generalmente se hace para evitar NPE. Sin embargo, generalmente prefiero hacer una comprobación explícita de nulo.

1

Guardaría el código "CONSTANT.equals (possibleNull)" sin la prueba nula solo si es una condición normal que la variable podría ser nula, por ejemplo porque acaba de salir de un mapa de propiedades.

Del mismo modo que puede salirse con la no comprobación de nulo en instanceof controles - como:

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

Pero si realmente no esperaba nula, debe comprobar de forma explícita para que en una prueba si es independiente, y manejarlo apropiadamente. En general, es mejor detectar estos errores de datos más temprano que tarde.

0

Si usted está preocupado por la calidad de su código escriba una clase de ayuda que se encarga de prueba de la igualdad:

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

Entonces utilizar de esta manera:

if (ObjectHelper.testEquality(aStringVariable, My_CONSTANT_STRING)) 

Su llamada constante PODRÍA dejar de ser constante. Puede leerse desde un archivo de configuración en el futuro.

+0

Java 7 tiene un método de ayuda integrado ['java.util.Objects.equals (..)'] (http://docs.oracle.com/javase/7/docs/api/java/util/Objects.html# equals (java.lang.Object,% 20java.lang.Object)) que hace justamente esto. –