1

有一个关于 AutoValue 的演示文稿(一种在 Java 中定义不可变对象的简洁方法,具有 , 等的合理默认值equalshashCodehttps://docs.google.com/presentation/d/14u_h-lMn7f1rXE1nDiLX0azS3IkgjGl5uxp5jGJ75RE/edit#slide=id。 g2a5e9c4a8_047

一开始,他们讨论了 AutoValue 的一些替代方案。显然,一种替代方法是手动编码的 POJO。他们警告说这个 POJO 出乎意料地难以改变。

我在这里抄录了这张幻灯片:

改变真的有那么大的风险吗?

假设一个必需的 int 字段变为可选的。你改变

int number;

Integer number;

测试仍然通过......一切都很好......直到有一天,放入集合中的对象开始神秘地从集合中“消失”!为什么?(留给读者作为练习。)

我无法弄清楚这个“练习”。什么样的“消失”?contains(element)竟然是falsesize()没有减量remove()iterator()不再包含该元素?为什么会发生这些?

4

1 回答 1

3

AFAIK 会破坏的主要事情是equals,因为当是一个this.number == obj.number时有意想不到的结果。numberInteger

我认为这会影响containsremove两者都出乎意料false)。

不过,我对 Java 还是有点陌生​​,所以如果有人有其他意见或答案,我将不胜感激。大多数情况下,我不认为sizeiterator不会受到影响,因此大概该元素仍会出现在使用iterator或以某种更奇特的方式获取内容的调试器中。对我来说,这听起来不像“消失”,所以我想知道我是否遗漏了什么。

于 2017-12-13T19:48:35.237 回答