A partir do Java 1.5, você pode muito bem intercâmbio Integer
com int
em muitas situações.
No entanto, encontrei um defeito em potencial no meu código que me surpreendeu um pouco.
O código a seguir:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
parecia estar definindo incorretamente incompatibilidade quando os valores eram iguais, embora não seja possível determinar em que circunstâncias. Eu defini um ponto de interrupção no Eclipse e vi que os Integer
valores eram ambos 137, e eu inspecionei a expressão booleana e ela disse que era falsa, mas quando eu a pisei, estava configurando incompatibilidade como true.
Alterando o condicional para:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
corrigiu o problema.
Alguém pode esclarecer por que isso aconteceu? Até agora, só vi o comportamento no meu host local no meu próprio PC. Nesse caso em particular, o código conseguiu passar por cerca de 20 comparações, mas falhou em 2. O problema era consistentemente reproduzível.
Se for um problema predominante, deve estar causando erros em nossos outros ambientes (dev e test), mas até agora, ninguém relatou o problema após centenas de testes executando esse trecho de código.
Ainda não é legítimo usar ==
para comparar dois Integer
valores?
Além de todas as boas respostas abaixo, o seguinte link stackoverflow possui algumas informações adicionais. Na verdade, ele teria respondido à minha pergunta original, mas como não mencionei o autoboxing na minha pergunta, ele não apareceu nas sugestões selecionadas:
Por que o compilador / JVM não pode simplesmente fazer com que a caixa automática funcione?