: https://docs.google.com/presentation/d/14u_h-lMn7f1rXE1nDiLX0azS3IkgjGl5uxp5jGJ75RE/edit#slide=id.g2a5e9c4a8_047int에서 Integer로 필드를 변경하면 개체가 Sets에서 사라질 수 있습니다. (<code>equals</code>, <code>hashCode</code>에 대한 의미있는 디폴트와 자바 불변의 객체를 정의하는 간결한 방법 등) AutoValue에 프레젠테이션있다
태초에, 그들은 AutoValue 몇 가지 대안을 통해 이동합니다. 분명히, 하나의 대안은 손으로 코딩 된 POJO입니다. 그들은이 POJO가 예기치 않게 변경하기 어렵다고 경고합니다.
여기 슬라이드를 전사했습니다
변경은 정말 위험하다?
필수 int 필드가 선택 사항이라고 가정합니다. 당신은
Integer number;
테스트에
int number;
을 변경 여전히 통과 ... 모든 것이 괜찮아 ... 어느 날, 시작 신비 세트에서 "사라"설정에 넣어 객체! 왜? (독자에게 연습 과제로 남겨 둔다.)
나는이 "운동"을 이해할 수 없다. 어떤 종류의 "사라지는"? contains(element)
은 예기치 않게 false
입니까? 은 remove()
없이 감소합니다. iterator()
에 더 이상 요소가 포함되어 있지 않습니까? 그리고 왜 이런 일이 일어날까요?
'=='를 사용하는 모든 int 비교는 127보다 큰 값에서 실패하기 시작합니다 ('Integer' 값 0-127이 캐시 됨). 당신이'Set'에 프리미티브를 넣을 수 없기 때문에 이것이 어떻게 영향을 미칠지 확신하지 못했을 때, 그들은 boxed를 얻습니다. 나는'int' 멤버가'equals()'집합에서 사용 된 다른 클래스의 구현물이라고 가정합니다. 그러나 캐시되지 않은 값에 대해서는'=='이 예상대로 작동하지 않습니다. –