簡體   English   中英

Google Guava / Equivalence /不同的equals()和hashCode()方法實現

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM