Począwszy od Javy 1.5, można Integer
z niej korzystać int
w wielu sytuacjach.
Jednak znalazłem potencjalną wadę w moim kodzie, która trochę mnie zaskoczyła.
Poniższy kod:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
wydawało się, że ustawienie niezgodności jest nieprawidłowe, gdy wartości były równe, chociaż nie mogę określić, w jakich okolicznościach. Ustawiłem punkt przerwania w Eclipse i zobaczyłem, że Integer
wartości były równe 137, i sprawdziłem wyrażenie logiczne i stwierdziłem, że jest fałszywe, ale kiedy go przekroczyłem, ustawiało niezgodność na true.
Zmiana warunku na:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
naprawiono problem.
Czy ktoś może rzucić trochę światła na to, dlaczego tak się stało? Jak dotąd widziałem zachowanie tylko na moim hoście lokalnym na moim własnym komputerze. W tym konkretnym przypadku kod z powodzeniem pokonał około 20 porównań, ale zawiódł na 2. Problem był powtarzalny.
Jeśli jest to powszechny problem, powinien powodować błędy w innych naszych środowiskach (deweloperskich i testowych), ale jak dotąd nikt nie zgłosił problemu po setkach testów wykonujących ten fragment kodu.
Czy nadal nie jest to zgodne z prawem ==
porównywanie dwóch Integer
wartości?
Oprócz wszystkich dobrych odpowiedzi poniżej, poniższy link stackoverflow zawiera sporo dodatkowych informacji. Właściwie odpowiedziałby na moje pierwotne pytanie, ale ponieważ nie wspomniałem w moim pytaniu o autoboxingu, nie pojawił się w wybranych sugestiach:
Dlaczego kompilator / JVM nie może po prostu sprawić, by autoboxing „po prostu działał”?