作者AmosYang (Zzz...)
看板Translate-CS
标题Re: [翻译] Java Collection API 的怪事
时间Fri Mar 22 17:16:20 2013
※ 引述《PsMonkey (痞子军团团长)》之铭言:
: 重点在於,`UnmodifiableCollection` 并没有实作 `hashCode()` 跟 `equals()`,
: 所以当你要一个 `UnmodifiableCollection` 作 `hashCode()` 时,
: 会直接使用 `Object` 的 `hashCode()`。
这个题目很有意思
与其说 UnmodifiableCollection 没有实作 hashCode 与 equals
更精确的说法是: UnmodifiableCollection 没办法有意义地实作 hashCode 与 equals
原因在於 delegate pattern: UnmondifiableCollection 与其原本的 Collection
之间是 has-a 而非 is-a 的关系
原文里举了以下这个例子
List L = { /* a list of things */ }
Collection C1 = L.unmodifiableCollection();
Collection C2 = L.unmodifiableList();
bool B1 = C1.equals(C2);
bool B2 = C2.equals(C1);
这时候
1. 在 Java 里, B1 与 B2 必须有一样的结果
2. List.equals(x) 规定, 如果 x 不是 List, 那就不能传回 true
3. C2 是个 List
4. C1 只是个 Collection
因为 #2, 3, 4, 所以 B2 必须传回 false -- #5
因为 #1 与 #5, B1 也必须是 false -- #6
至此,读者可以试试看去实作 UnmodifiableCollection.equals()
就会发现,要嘛就是无法正确处理上述这类案例,要嘛最後总是传回 false
是故,乾脆放弃实作 equals() 的打算; 易言之,不是不为,而是不能为矣
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 98.26.14.35
※ 编辑: AmosYang 来自: 98.26.14.35 (03/22 17:21)
※ 编辑: AmosYang 来自: 98.26.14.35 (03/22 17:28)
※ 编辑: AmosYang 来自: 98.26.14.35 (03/22 17:31)