예는 나쁜 냄새, 그리고 위의 @arshajii 설명대로, 대신 equals()
방법을 사용해야합니다.
내가 가장 흥미를 끈 것은 작은 값 (-128에서 127)으로 시작하는 것처럼 이러한 비교가 때때로 작동 할 수도 있다는 사실입니다. 더 큰 숫자의 경우에는 중단됩니다. 예를 들면 다음과 같습니다.
@Test
public void compareSmallIds() {
Long id1 = 127L;
Long id2 = 127L;
Assert.assertTrue(id1 == id2);
Assert.assertTrue(id1.equals(id2));
Assert.assertTrue((long) id1 == (long) id2);
Assert.assertTrue(id1.longValue() == id2.longValue());
}
@Test
public void compareIds() {
Long id1 = 500L;
Long id2 = 500L;
Assert.assertFalse(id1 == id2);
Assert.assertTrue(id1.equals(id2));
Assert.assertTrue((long) id1 == (long) id2);
Assert.assertTrue(id1.longValue() == id2.longValue());
}
이 동작은 숫자 값 범위가 기본값 인 숫자 캐시 정책 정의를 기반으로합니다. 그러나 확실히 원시가 아닌 값을 가진 코드는 값 비교를 위해 ==
연산자에 의존해서는 안됩니다!
이러한 long은 원시 유형입니까, 아니면 객체입니까? (java.lang.Long) 그들은 서로 다른 두 가지입니다 – DirkyJerky
FindBugs의 어떤 버전에서이 규칙이 정의됩니까? 버전 3.0.1 (http://findbugs.sourceforge.net/bugDescriptions.html)에 대한 설명 목록에서 해당 코드를 찾을 수 없으며 향상된 코드 안전성을 위해 활성화하려고합니다. –