Как и в случае с Java 1.5, во многих ситуациях вы можете в значительной степени обменять Integer
на int
.
Однако я обнаружил потенциальный дефект в моем коде, который немного меня удивил.
Следующий код:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
оказалось неправильным установление несоответствия, когда значения были равны, хотя я не могу определить, при каких обстоятельствах. Я установил точку останова в Eclipse и увидел, что значения Integer
равны 137, и я проверил логическое выражение, и он сказал, что это ложь, но когда я перешагнул его, он установил несоответствие true.
Изменение условного выражения на:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
исправлена проблема.
Может кто-нибудь пролить свет на то, почему это произошло? До сих пор я видел поведение на своем локальном хосте на своем собственном компьютере. В этом конкретном случае код успешно завершил около 20 сравнений, но не прошел 2. Проблема была последовательно воспроизводимой.
Если это распространенная проблема, она должна вызывать ошибки в наших других средах (dev и test), но до сих пор никто не сообщал о проблеме после нескольких сотен тестов, выполняющих этот фрагмент кода.
Нельзя ли использовать ==
для сравнения двух значений Integer
?
В дополнение ко всем тонким ответам ниже, следующая ссылка stackoverflow имеет довольно немного дополнительной информации. Он действительно ответил бы на мой первоначальный вопрос, но поскольку я не упоминал автобоксинг в моем вопросе, он не отображался в выбранных предложениях:
Почему компилятор /JVM просто не делает автобоксинг "просто работать" ?