A partir de Java 1.5, puede intercambiar casi Integer
con int
en muchas situaciones.Java: Entero es igual a ==
Sin embargo, encontré un defecto potencial en mi código que me sorprendió un poco.
El siguiente código:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
parecía estar estableciendo de forma incorrecta desajuste cuando los valores son iguales, aunque no puedo determinar bajo qué circunstancias. Establecí un punto de interrupción en Eclipse y vi que los valores de Integer
eran ambos 137, e inspeccioné la expresión booleana y decía que era falsa, pero cuando puse el pie sobre ella, estaba estableciendo la discrepancia en verdadero.
Cambio de la condicional a:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
solucionado el problema.
¿Alguien puede arrojar algo de luz sobre por qué sucedió esto? Hasta ahora, solo he visto el comportamiento en mi localhost en mi propia PC. En este caso particular, el código logró superar las 20 comparaciones, pero falló en 2. El problema fue consistentemente reproducible.
Si es un problema frecuente, debería estar causando errores en nuestros otros entornos (desarrollo y prueba), pero hasta el momento, nadie ha informado del problema después de cientos de pruebas al ejecutar este fragmento de código.
¿Todavía no es legítimo usar ==
para comparar dos valores de Integer
?
Además de todas las buenas respuestas a continuación, el siguiente enlace stackoverflow tiene bastante información adicional. En realidad, habría contestado a mi pregunta original, sino porque no he mencionado autoboxing en mi pregunta, no se mostrará en las sugerencias seleccionados:
Why can't the compiler/JVM just make autoboxing “just work”?
¡Gracias, eso sin duda explica por qué 137 falla! Y también responde mi pregunta acerca de por qué no es un problema frecuente, en el 95% de los casos que voy a encontrar, el valor sería inferior a 127. Sin embargo, es bueno captar esto ahora para el 5% donde no lo es. –
Nota interesante: hasta hace un par de semanas, cdiCt y cdsCt eran dos enteros así que estaba bien, pero tuve que convertirlos en enteros para verificar la situación nula que se maneja de manera diferente ... –
@Jeremy Sí, es un problema bastante oscuro, pero como regla general usas .equals() para Objects y == para primitives. No puede confiar en el autoenvío para pruebas de igualdad. – Adam