2017-12-13 1 views
0

: 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()에 더 이상 요소가 포함되어 있지 않습니까? 그리고 왜 이런 일이 일어날까요?

+0

'=='를 사용하는 모든 int 비교는 127보다 큰 값에서 실패하기 시작합니다 ('Integer' 값 0-127이 캐시 됨). 당신이'Set'에 프리미티브를 넣을 수 없기 때문에 이것이 어떻게 영향을 미칠지 확신하지 못했을 때, 그들은 boxed를 얻습니다. 나는'int' 멤버가'equals()'집합에서 사용 된 다른 클래스의 구현물이라고 가정합니다. 그러나 캐시되지 않은 값에 대해서는'=='이 예상대로 작동하지 않습니다. –

답변

1

AFAIK this.number == obj.numbernumberInteger 일 때 예기치 않은 결과가 나기 때문에 가장 큰 것은 equals입니다.

이는 뿐만 아니라 remove (예기치 않게 모두 false)에 영향을 미칩니다.

저는 여전히 Java로 약간 녹색입니다. 따라서 누군가 다른 의견이나 답변을 갖고 있다면, 고맙겠습니다. 대체로 size 또는 iterator이 영향을받지 않을 것이라고 생각합니다. 따라서 iterator을 사용하는 디버거 또는 내용을 얻는 더 멋진 방법으로 요소가 계속 표시됩니다. 저에게 "사라지는"소리처럼 들리지 않으므로 아무것도 놓치고 있는지 알고 싶습니다.

관련 문제