À partir de Java 1.5, vous pouvez pratiquement échanger Integer
avec int
dans de nombreuses situations.
Cependant, j'ai trouvé un défaut potentiel dans mon code qui m'a un peu surpris.
Le code suivant:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
semblait définir incorrectement une incompatibilité lorsque les valeurs étaient égales, bien que je ne puisse pas déterminer dans quelles circonstances. J'ai défini un point d'arrêt dans Eclipse et j'ai vu que les Integer
valeurs étaient toutes les deux de 137, et j'ai inspecté l'expression booléenne et il a dit qu'elle était fausse, mais quand je l'ai enjambée, elle définissait l'incohérence sur vrai.
Changer le conditionnel en:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
résolu le problème.
Quelqu'un peut-il expliquer pourquoi cela s'est produit? Jusqu'à présent, je n'ai vu le comportement de mon hôte local que sur mon propre PC. Dans ce cas particulier, le code a réussi à dépasser environ 20 comparaisons, mais a échoué sur 2. Le problème était toujours reproductible.
S'il s'agit d'un problème répandu, il devrait causer des erreurs sur nos autres environnements (développement et test), mais jusqu'à présent, personne n'a signalé le problème après des centaines de tests exécutant cet extrait de code.
N'est-il toujours pas légitime d'utiliser ==
pour comparer deux Integer
valeurs?
En plus de toutes les bonnes réponses ci-dessous, le lien stackoverflow suivant contient un peu d'informations supplémentaires. Cela aurait en fait répondu à ma question initiale, mais comme je n'ai pas mentionné la mise en boîte automatique dans ma question, il n'apparaît pas dans les suggestions sélectionnées:
Pourquoi le compilateur / JVM ne peut-il pas simplement faire fonctionner l'autoboxing?