为什么将字段从 int 更改为 Integer 会导致对象从 Set 中消失?
Why might changing a field from int to Integer cause objects to disappear from Sets?
有一个关于 AutoValue 的介绍(一种在 Java 中定义不可变对象的简洁方法,具有 equals
、hashCode
等的合理默认值):https://docs.google.com/presentation/d/14u_h-lMn7f1rXE1nDiLX0azS3IkgjGl5uxp5jGJ75RE/edit#slide=id.g2a5e9c4a8_047
一开始,他们讨论了 AutoValue 的一些替代方案。显然,一种替代方法是手动编码的 POJO。他们警告说这个 POJO 出乎意料地难以更改。
我已经在此处转录了幻灯片:
Are changes really that risky?
Suppose a required int field becomes optional. You change
int number;
to
Integer number;
Tests still pass... and everything's fine... until one day, objects put into Sets start mysteriously "disappearing" from the set! Why? (Left as an exercise to the reader.)
我搞不懂这个 "exercise"。什么样的"disappearing"? contains(element)
居然是false
? size()
在没有 remove()
的情况下递减? iterator()
不再包含该元素?为什么会发生这些?
AFAIK 会破坏的主要内容是 equals
,因为当 number
是 Integer
.
时 this.number == obj.number
会产生意想不到的结果
我认为这会影响 contains
和 remove
(都出乎意料 false
)。
虽然我对 Java 还是有点陌生,所以如果有人有其他评论或答案,我将不胜感激。大多数情况下,我认为 size
或 iterator
不会受到影响,因此大概该元素仍会出现在使用 iterator
或一些更高级的获取内容方式的调试器中。这对我来说听起来不太像 "disappearing",所以我想知道我是否遗漏了什么。
有一个关于 AutoValue 的介绍(一种在 Java 中定义不可变对象的简洁方法,具有 equals
、hashCode
等的合理默认值):https://docs.google.com/presentation/d/14u_h-lMn7f1rXE1nDiLX0azS3IkgjGl5uxp5jGJ75RE/edit#slide=id.g2a5e9c4a8_047
一开始,他们讨论了 AutoValue 的一些替代方案。显然,一种替代方法是手动编码的 POJO。他们警告说这个 POJO 出乎意料地难以更改。
我已经在此处转录了幻灯片:
Are changes really that risky?
Suppose a required int field becomes optional. You change
int number;
to
Integer number;
Tests still pass... and everything's fine... until one day, objects put into Sets start mysteriously "disappearing" from the set! Why? (Left as an exercise to the reader.)
我搞不懂这个 "exercise"。什么样的"disappearing"? contains(element)
居然是false
? size()
在没有 remove()
的情况下递减? iterator()
不再包含该元素?为什么会发生这些?
AFAIK 会破坏的主要内容是 equals
,因为当 number
是 Integer
.
this.number == obj.number
会产生意想不到的结果
我认为这会影响 contains
和 remove
(都出乎意料 false
)。
虽然我对 Java 还是有点陌生,所以如果有人有其他评论或答案,我将不胜感激。大多数情况下,我认为 size
或 iterator
不会受到影响,因此大概该元素仍会出现在使用 iterator
或一些更高级的获取内容方式的调试器中。这对我来说听起来不太像 "disappearing",所以我想知道我是否遗漏了什么。