![](/img/trans.png)
[英]Did I implement equals and hashCode correctly using Google Guava?
[英]Google Guava / Equivalence / different equals() and hashCode() method implementations
我希望能夠在兩個equals-Implementations之間切換,但我不確定Google Guava的Equivalence
類是否可以提供此功能。 假設我有兩個equals方法equalsContent()和equalsKeys()或類似的東西我想以某種方式將equals方法委托給兩個私有方法之一(兩個hashCode方法相同)。
好吧,我在某種程度上不確定Equivalence
抽象類和Equivalences
類(靜態方法)的用法是什么。
此外,您將如何實現上述所需的屬性? 我可以使用另一個簡單地為值設置標志或枚舉的方法,並使用兩個抽象方法(equals(),hashCode())在枚舉中實現兩個equals和hash方法,並簡單地調用enum.equals()或enum equals()和hashCode()方法中的.hashCode()。 你怎么看?
我認為枚舉方法從面向對象的角度來看是有意義的,但它很危險。 它可以打破equals()
和hashCode()
契約(反身性,對稱性和傳遞性)。 例如,插入使用第一個等價策略的實例和在同一個Set
中使用第二個等價策略的實例會導致問題。
如果你想要不同的等價關系,你應該把它們排除在你的班級之外。 Equivalence
允許您這樣做:通過實現Equivalence並覆蓋doHash()
和doEquivalent()
方法來提取等價邏輯(equals()/ hashCode())。
然后,當您想要使用基於一個等價或另一個的Collection
,可以使用Equivalence.wrap()
。 例如,您可以通過執行以下操作來模擬IdentityHashSet
:
Set<Equivalence.Wrapper<String>> identityHashSet = Sets.newHashSet();
String a1 = "a";
String a2 = new String("a");
String b = "b";
identityHashSet.add(Equivalences.identity().wrap(a1));
identityHashSet.add(Equivalences.identity().wrap(a2));
identityHashSet.add(Equivalences.identity().wrap(a3));
// identityHashSet contains "a", "a", and "b"
// a standard HashSet would only contain "a" and "b"
// while a1 and a2 are equal according to String.equals(), they are different instances.
當然,您可以使用ForwardingSet
自動執行元素的換行/解包。
這個番石榴問題有更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.