Al comparar una variable de cadena con un literal de cadena con .equals (), ¿existe una práctica estándar para el orden de los elementos? [cerrado]

11

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é?

BrandonV
fuente
2
Si nulo es o no un valor esperado, ¿debería ser la operación "igual" el lugar para determinar que esto es un problema?
Matthew Flynn
No lo creo. Pero esa es mi opinión. Me gustaría escuchar la lógica de los demás.
BrandonV
En los idiomas que usan = y / o == para tareas / comparaciones, normalmente es una buena práctica colocar lo que no puede cambiar a la izquierda para que no pueda hacer una asignación accidental cuando tenía la intención de hacer una comparación. Para los lenguajes que usan métodos en un objeto como .equals, no creo que importe.
GordonM

Respuestas:

3

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:

if (x = 3)

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:

if (3 = x)

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.

Oleksi
fuente
-1 Esta no es la razón de la convención de Java equals. A diferencia de C, el problema para Java es que la expresión x.equals(y)arrojará un NPE cuando xsea ​​nulo. Si tiene un literal de cadena "something"y desea considerar el caso nullcomo "no igual", tiene sentido escribir "something".equals(y)si no sabe si ypuede ser nulo. Esto nunca arrojará un NPE.
Andres F.
1
  • 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 usando myStringVar.equals("myString").

CodeART
fuente
3
Al menos en Java, no lo use ==porque solo compara referencias de objetos. Dicho esto, +1 para la convención setiment - a menudo define la forma "correcta" de hacer las cosas.
Michael K
¡Gracias por señalar esto! He actualizado la respuesta :)
CodeART
@ CodeWorks: Creo que te perdiste el punto de Michael. Además, es Java, no JAVA.
amara
La pregunta era: "¿pero qué se considera la mejor práctica / estándar? ¿Por qué?" Mi respuesta es que las mejores prácticas y estándares varían de una organización a otra. estás en desacuerdo con eso?
CodeART
@ CodeWorks: Nadie podría estar en desacuerdo con eso, CodeWorks. Pero todos podrían estar de acuerdo en que myStringVar == "myString"es una idea muy mala en Java (a menos que esté absolutamente seguro de que myStringVarestá internado).
amara
0

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:

private final String MY_STRING = "myString";
if(MY_STRING).equals(myStringVar);

Especialmente si hay potencial para usar la cadena en más de un lugar.

Benjamin Wootton
fuente
2
-1: en realidad no es mejor; agrega desorden con un valor generalmente insignificante
amara
@sparkleshy: no estoy de acuerdo, realmente no quieres que los literales de cadena se regulen a través de la lógica de tu código. Como se mencionó en la respuesta original, si el literal de cadena se usa en más de un lugar, definitivamente diría que los refactorice.
Benjamin Wootton
Para decir eso, debe disipar completamente Python, ya que en Python, los identificadores básicamente SON literales de cadena. Y creo que todos tenemos que estar de acuerdo en que Python es un buen lenguaje.
amara