Що стосується Java 1.5, ви можете в значній мірі взаємодіяти Integer
з int
багатьма ситуаціями.
Однак я знайшов потенційний дефект у своєму коді, який мене трохи здивував.
Наступний код:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
виявилося невірно встановлення невідповідності, коли значення були рівні, хоча я не можу визначити, за яких обставин. Я встановив точку розриву в Eclipse і побачив, що Integer
значення є обома 137, і я перевірив булевий вираз, і він сказав, що це помилково, але коли я переступив це, він встановлював невідповідність істинному.
Зміна умовного на:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
виправили проблему.
Чи може хтось пролити світло на те, чому це сталося? Поки що я бачив лише поведінку свого локального господаря на своєму ПК. У цьому конкретному випадку код успішно пройшов приблизно 20 порівнянь, але не вдався до 2. Проблема була постійно відтворюваною.
Якщо це поширена проблема, вона повинна викликати помилки в інших наших середовищах (розробник і тест), але поки що ніхто не повідомив про проблему після сотень тестів, що виконують цей фрагмент коду.
Чи все ж не є законним використовувати ==
для порівняння двох Integer
значень?
На додаток до всіх тонких відповідей нижче, наступне посилання stackoverflow містить ще трохи додаткової інформації. Насправді він би відповів на моє первісне запитання, але оскільки я не згадав про автобоксинг у своєму питанні, він не відображався у вибраних пропозиціях:
Чому компілятор / JVM не може зробити автобоксинг «просто діючим»?