A partire da Java 1.5, è possibile interscambiare praticamente Integer
con int
in molte situazioni.Java: intero uguale a ==
Tuttavia, ho trovato un potenziale difetto nel mio codice che mi ha sorpreso un po '.
Il codice seguente:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
sembrava essere l'impostazione errata disallineamento quando i valori sono uguali, anche se non è possibile determinare in quali circostanze. Ho impostato un punto di interruzione in Eclipse e ho visto che i valori di Integer
erano entrambi 137, e ho controllato l'espressione booleana e ho detto che era falso, ma quando l'ho scavalcato, è stata impostata la corrispondenza errata su true.
Modifica del condizionale:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
risolto il problema.
Qualcuno può far luce sul motivo per cui è successo? Finora, ho visto solo il comportamento sul mio localhost sul mio PC. In questo caso particolare, il codice ha superato con successo circa 20 confronti, ma non è riuscito su 2. Il problema è stato costantemente riproducibile.
Se si tratta di un problema prevalente, dovrebbe causare errori negli altri ambienti (dev e test), ma finora nessuno ha segnalato il problema dopo centinaia di test nell'esecuzione di questo snippet di codice.
Non è ancora legittimo utilizzare ==
per confrontare due valori Integer
?
In aggiunta a tutte le risposte corrette di seguito, il seguente link StackOverflow ha un bel po 'di informazioni aggiuntive. In realtà avrebbe risposto alla mia domanda iniziale, ma perché non ho menzionato autoboxing nella mia interrogazione, non ha mostrato nelle proposte selezionate:
Why can't the compiler/JVM just make autoboxing “just work”?
Grazie, questo sicuramente spiega perché 137 fallisce! E risponde anche alla mia domanda sul perché non si tratta di un problema prevalente, nel 95% dei casi che ho intenzione di incontrare, il valore sarebbe inferiore a 127. Buono per catturarlo ora però per il 5% dove non lo è. –
Interessante nota a margine: fino a un paio di settimane fa, cdiCt e cdsCt erano entrambi intatti quindi andava bene, ma dovevo renderli interi per verificare la situazione nulla che viene gestita in modo diverso ... –
@Jeremy Sì, è un problema piuttosto oscuro, ma come regola generale si usa .equals() per Objects e == per primitive. Non puoi fare affidamento su Autounboxing per il test di uguaglianza. – Adam