2012-05-08 25 views
11

Considere las siguientes dos líneas de códigoque tiene un mejor rendimiento:!! Prueba = null o nula = prueba

if (test ! = null) 

y

if (null != test) 

¿Hay alguna diferencia en dos declaraciones anteriores, el rendimiento ¿sabio? He visto a muchas personas usar el último y cuando se les preguntó que es una buena práctica sin una razón sólida.

+3

Este es un duplicado de http://stackoverflow.com/questions/2369226/null-check-in-java, excepto que este usa! = En lugar de igual. –

+0

Pregunta similar http://stackoverflow.com/questions/15518958/null-check-coding-standard/15519045 –

+0

Si bien nos referimos a las mejores prácticas, es posible que desee comenzar a agregar espacios entre el "si" y " ("Al combinar este cambio de estilo de código menor para cumplir con las convenciones de codificación java, incluso el revisor de código más exigente (yo) no tendrá nada que decir acerca de sus declaraciones if. Http://www.oracle.com/technetwork/java/javase/ documentation/codeconventions-142311.html # 449 – Russ

Respuesta

20

Sin diferencia.

El segundo es simplemente porque C/C++ donde los programadores siempre hicieron la tarea en lugar de comparar.

E.g.

// no compiler complaint at all for C/C++ 
// while in Java, this is illegal. 
if(a = 2) { 
} 
// this is illegal in C/C++ 
// and thus become best practice, from C/C++ which is not applicable to Java at all. 
if(2 = a) { 
} 

Mientras que el compilador Java generará un error de compilación.

Así que, personalmente, prefiero el primero debido a la legibilidad, la gente tiende a leer de izquierda a derecha, que se lee como if test is not equal to null en lugar de null is not equal to test.

+0

Gracias Marcaré esto como una respuesta –

2

En segundo lugar me busca como "condición de Yoda", es decir, if(2 == x) ... y es mucho menos legible.

3

No hay diferencia en el rendimiento, pero personalmente encuentro que el segundo es confuso.

1

Es una buena práctica evitar algunos errores tipográficos básicos que la mayoría de los IDE modernos recogerán, porque a veces se desea hacer comparaciones entre tipos más complejos que no son nulos y terminan haciendo asignaciones accidentales. Entonces, el patrón sigue siendo el mismo, pero nunca lo he visto vinculado al rendimiento y nunca lo he visto generar código de bytes especial.

La idea es tener primero el valor estático conocido, para que no pueda lanzar ningún tipo de excepción extraña cuando realiza la comparación.

Ninguno de los dos métodos es "más correcto", por lo que depende de usted decidir qué desea usar.

20

Son exactamente lo mismo. La segunda puede tener sentido cuando se utiliza iguales:

if("bla".equals(test)) 

nunca puede lanzar una NullPointerException Considerando lo siguiente:

if(test.equals("bla")) 

lata.

+0

Gracias +1. Eso tiene sentido –

1

no hay diferencia. Pero de la segunda forma evitas el error tipográfico como test = null. Porque de la segunda forma obtendrás un error de compilación.

+0

A menos que 'test' no sea un objeto de tipo java.lang.Boolean, obtendrá un error del compilador en el primer caso, también. Prueba de objeto = nulo; \t \t if (test = null) { \t \t \t // no se compila. No se puede convertir Oject a boolean \t \t} – Polygnome

1

No es una mejor práctica usar la última. Ambos son equivalentes, pero el primero es más fácil de leer.

Esta "mejor práctica" proviene de C donde boolean no existe. Los enteros se utilizan en su lugar, y if (foo = 1) no es un error de sintaxis, pero es completamente diferente de if (foo == 1).

En Java, solo las expresiones booleanas pueden estar dentro de un if, y esta práctica no tiene mucho sentido.

0

No hay realmente diferente entre dos formas. No existe un problema de rendimiento, pero existen las siguientes notas:

  • El primer formulario es legible para el lector de códigos, porque las personas generalmente leen los códigos de izquierda a derecha.
  • segunda forma es mejor para el escritor de código, ya que en java = operador es para misiones y == operador es equivalente a prueba, pero la gente suele usar en if comunicado = en lugar de ==, por segundo desarrollador approch conseguir Compile-Time-Error porque nula no puede usar en Left-Side de una declaración de asignación.
Cuestiones relacionadas