Hay beneficios para cada uno y entiendo las diferencias, pero ¿qué se considera la mejor práctica / estándar? ¿Y por qué?
Por ejemplo :
"myString".equals(myStringVar)
- Evita un NPE potencial y no requiere una verificación nula. (¿Buena cosa?)
- Más limpio para leer ya que no se requiere una verificación nula.
- Si nulo no es un valor esperado, su programa podría estar fallando sin ser más sabio.
sin embargo
myStringVar.equals("myString")
- Requiere una comprobación nula si nulo es un valor esperado. (¿Buena cosa?)
- Puede abarrotar condicionales compuestos con controles nulos.
- Permite que NPE nos haga saber si algo se ha roto.
¿Qué variación se considera el estándar a utilizar para Java y por qué?
java
programming-practices
coding-standards
BrandonV
fuente
fuente
Respuestas:
Sospecho que esto se origina a partir de una precaución de seguridad utilizada al programar en C (o C ++) anterior. En C, puede asignar un valor accidentalmente cuando quiere probar la igualdad:
Esta condición siempre será verdadera, ya que es un valor de asignación xa de 3, sin probar que x es igual a 3. Para evitar estos errores sutiles, los desarrolladores comenzaron a revertir la condición:
Este contiene el mismo "error", pero generará un error de compilación, por lo que es más seguro.
Los idiomas más modernos no tienen este problema, y pueden advertirte fácilmente cuando intentas hacer este tipo de cosas. Como tal, no es una preferencia pura, así que elige una y úsala constantemente.
fuente
equals
. A diferencia de C, el problema para Java es que la expresiónx.equals(y)
arrojará un NPE cuandox
sea nulo. Si tiene un literal de cadena"something"
y desea considerar el casonull
como "no igual", tiene sentido escribir"something".equals(y)
si no sabe siy
puede ser nulo. Esto nunca arrojará un NPE.Las prácticas estándar y buenas variarían según la cultura de la organización para la que trabaja.
Nuestro estándar en .NET es
myStringVar == "myString"
simplemente porque lo hemos acordado, es decir, creemos que es limpio y concisa.Nota: Esto no se aplica a Java debido a la
==
comparación de las referencias en lugar de los objetos en sí. En Java deberías estar usandomyStringVar.equals("myString")
.fuente
==
porque solo compara referencias de objetos. Dicho esto, +1 para la convención setiment - a menudo define la forma "correcta" de hacer las cosas.myStringVar == "myString"
es una idea muy mala en Java (a menos que esté absolutamente seguro de quemyStringVar
está internado).Creo que tienes razón en que depende de la semántica de nulidad de la variable. Si no espera que sea nulo y no tenga que verificarlo y manejarlo, entonces el primer formulario es más limpio.
Dicho esto, en lugar de incrustar el literal de cadena, una mejor opción probablemente sería esta:
Especialmente si hay potencial para usar la cadena en más de un lugar.
fuente