Escuché de alguien que null == object
es mejor que object == null
chequear
p.ej :
void m1(Object obj ) {
if(null == obj) // Is this better than object == null ? Why ?
return ;
// Else blah blah
}
¿Hay alguna razón o esto es otro mito? Gracias por la ayuda.
null
referencias, el curso de acción predeterminado debería ser lanzar una NPE. Algunas bibliotecas agradables (como la biblioteca de Java JDK7) tienen un método parecido apublic static <T> T notNull(T obj) { if (obj == null) { throw new NullPointerException(); } else { return obj; } }
. También hay@NonNull
(@Nonnull
¿ o ?), Pero eso se "borra".null == object
se conoce como una condición de Yoda .Respuestas:
Este es probablemente un hábito aprendido de C, para evitar este tipo de error tipográfico (simple en
=
lugar de doble==
):La convención de poner la constante en el lado izquierdo de
==
no es realmente útil en Java, ya que Java requiere que la expresión en unaif
evaluación sea unboolean
valor, por lo que, a menos que la constante sea aboolean
, obtendría un error de compilación de cualquier manera que ponga el argumentos. (y si es un booleano, no deberías usarlo de==
todos modos ...)fuente
x.booleanValue()
o!x.booleanValue()
.x == true
ox == false
en una condición la expresión es un mal olor, en mi humilde opinión.null == object
solo para asegurarnos de no sobrescribir el objeto accidentalmente con un error tipográfico no debería ser un caso de uso en absoluto. Lo que significa que nos estamos entrenando a nosotros mismos para que ahora que utilizo "nulo" primero, está bien, incluso si cometo un error. Eso no significa que el código funcione como se esperaba. Incluso sinull = object
se proporciona en lugar denull == object
, ¡el programa no funcionará como se esperaba! ¡Entonces no tiene sentido seguir esta convención!Como han dicho otros, es un hábito aprendido de C para evitar errores tipográficos, aunque incluso en C, esperaría compiladores decentes con niveles de advertencia lo suficientemente altos como para dar una advertencia. Como dice Chandru, comparar con nulo en Java de esta manera solo causaría problemas si estuviera usando una variable de tipo
Boolean
(que no está en el código de muestra). Yo diría que es una situación bastante rara, y no una para la que vale la pena cambiar la forma en que escribe el código en cualquier otro lugar. (No me molestaría en invertir los operandos incluso en este caso; si estoy pensando con la suficiente claridad como para considerar invertirlos, estoy seguro de que puedo contar los signos iguales).Lo que no se ha mencionado es que muchas personas (incluido yo mismo) encuentran que el
if (variable == constant)
formulario es más legible, es una forma más natural de expresarse. Esta es una razón para no copiar ciegamente una convención de C. Siempre debe cuestionar las prácticas (como lo está haciendo aquí :) antes de asumir que lo que puede ser útil en un entorno es útil en otro.fuente
Esto no tiene mucho valor en Java (1.5+) excepto cuando el tipo de objeto es
Boolean
. En cuyo caso, esto aún puede ser útil.if (object = null)
no causará fallas de compilación en Java 1.5+ si el objeto es,Boolean
pero lanzaría unNullPointerException
en tiempo de ejecución.fuente
En Java no hay una buena razón.
Un par de otras respuestas han afirmado que se debe a que accidentalmente puede asignarlo en lugar de igualdad. Pero en Java, debe tener un booleano en un if, así que esto:
no se compilará.
La única vez que esto podría importar en Java es si la variable es booleana:
fuente
== true
o igualmente== true == true
?== true
. Pero he visto tanto código incorrecto en mi carrera que ya no pregunto por qué alguien escribiría algo y simplemente acepto que algunas personas escribieron código innecesario / cuestionable.x == true
malo porque podría estar escrito erróneamente comox = true
, no tendría mucho sentido cambiarlo a entrue == x
lugar de solox
.Esto también se relaciona estrechamente con:
lo cual es conveniente si no desea tratar con NPE:
fuente
int
sea un tipo primitivo es relevante, ya que es imposible invocarequals
en unint
, por lo tanto, no tiene sentido discutir si usarx.equals(constant)
oconstant.equals(x)
paraint
valores. Y para losInteger
valores, el valor predeterminado es ennull
lugar de0
.Este truco se supone que evita
v = null
errores tipográficos.Pero Java solo permite expresiones booleanas como
if()
condiciones, por lo que ese truco no tiene mucho sentido, el compilador encontrará esos errores tipográficos de todos modos.Sin embargo, sigue siendo un truco valioso para el código C / C ++.
fuente
Por la misma razón lo haces en C; La asignación es una expresión, por lo que coloca el literal a la izquierda para que no pueda sobrescribirlo si accidentalmente usa en
=
lugar de==
.fuente
x
es igual5
, cuando escribes por errorif (x = 5)
, se compilará silenciosamente (y siempre evaluarátrue
, independientemente del valor dex
). Sin embargo, si adquiere el hábito de especificar siempre el literal primero: 'if (5 = x)', el compilador puede verificar su trabajo y ahorrarle tiempo de cabeza en el depurador. Los compiladores modernos hacen innecesario este hábito.obj
fuera del tipojava.lang.Boolean
(B grande), entonces podría marcar la diferencia (creo que, en realidad, no se intentó ni nada).Eso es para personas que prefieren tener la constante en el lado izquierdo. En la mayoría de los casos, tener la constante en el lado izquierdo evitará que se lance NullPointerException (o tener otro nullcheck). Por ejemplo, el método String equals también realiza una comprobación nula. Tener la constante a la izquierda le impedirá escribir el cheque adicional. Lo cual, de otra manera también se realiza posteriormente. Tener el valor nulo a la izquierda es simplemente ser consistente.
me gusta:
fuente
Es la condición de Yoda escribiendo de manera diferente.
En java
condición de yoda
fuente
Compare con el siguiente código:
Salida (después de varias ejecuciones):
Por tanto,
pingResult != null
es el ganador.fuente
Debido a su propiedad conmutativa , la única diferencia entre
object == null
ynull == object
(la versión de Yoda ) es de naturaleza cognitiva : cómo el lector lee y digiere el código. Sin embargo, no sé la respuesta definitiva, pero sé que personalmente prefiero comparar el objeto que estoy inspeccionando con otra cosa, en lugar de comparar otra cosa con el objeto que estoy inspeccionando , si eso tiene algún sentido. Comience con el tema, luego el valor con el que compararlo.En algunos otros idiomas, este estilo de comparación es más útil.
Sin embargo, para protegerse contra un signo "=" perdido en general, creo que escribir
null == object
es un acto equivocado de programación defensiva . La mejor forma de evitar este código en particular es garantizando el comportamiento con una prueba junit. Recuerde, el posible error de perder un "=" no depende de los argumentos de entrada del método; usted no depende del uso correcto de esta API por parte de otras personas, por lo que una prueba junit es perfecta para protegerse contra eso. De todos modos, querrá escribir pruebas junit para verificar el comportamiento; un "=" faltante naturalmente cae dentro del alcance.fuente