A partir de Java 1.5, se puede casi el intercambio Integer
con int
en muchas situaciones.
Sin embargo, encontré un posible defecto 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 configurando incorrectamente la falta de coincidencia cuando los valores eran iguales, aunque no puedo determinar en qué circunstancias. Establecí un punto de interrupción en Eclipse y vi que los Integer
valores eran 137, e inspeccioné la expresión booleana y dijo que era falsa, pero cuando la pasé, estaba configurando la falta de coincidencia en verdadero.
Cambiar el condicional a:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
Se solucionó el problema.
¿Alguien puede arrojar algo de luz sobre por qué sucedió esto? Hasta ahora, solo he visto el comportamiento en mi host local en mi propia PC. En este caso particular, el código superó con éxito unas 20 comparaciones, pero falló en 2. El problema fue reproducible de manera consistente.
Si es un problema frecuente, debería estar causando errores en nuestros otros entornos (desarrollo y prueba), pero hasta ahora, nadie ha informado el problema después de cientos de pruebas que ejecutan este fragmento de código.
¿Todavía no es legítimo usar ==
para comparar dos Integer
valores?
Además de todas las respuestas detalladas a continuación, el siguiente enlace stackoverflow tiene bastante información adicional. En realidad, habría respondido a mi pregunta original, pero como no mencioné el autoboxing en mi pregunta, no apareció en las sugerencias seleccionadas:
¿Por qué el compilador / JVM no puede hacer que el autoboxing "simplemente funcione"?