gpt4 book ai didi

java - Google Guava/Equivalence/不同的 equals() 和 hashCode() 方法实现

转载 作者:搜寻专家 更新时间:2023-11-01 01:56:25 25 4
gpt4 key购买 nike

我希望能够在两个 equals 实现之间切换,但我不确定 Google Guava 的 Equivalence 类是否可以提供此功能。假设我有两个 equals 方法 equalsContent() 和 equalsKeys() 或类似的方法,我想以某种方式将 equals 方法委托(delegate)给两个私有(private)方法之一(两个 hashCode 方法也是如此)。

嗯,我不太确定 Equivalence 抽象类和 Equivalences 类(静态方法)的用法是什么。

此外,您将如何实现上述所需的属性?我可以使用另一种方法,它只需将标志或枚举设置为值,并使用两个抽象方法(equals()、hashCode())在枚举中实现两个 equals 和 hash 方法,然后简单地调用 enum.equals() 或 enum .hashCode() 在 equals() 和 hashCode() 方法中。你怎么看?

最佳答案

我认为枚举方法从面向对象的角度来看是有意义的,但它很危险。它可能会破坏 equals()hashCode() 契约(自反性、对称性和传递性)。例如,在同一 Set 中插入一个使用第一个等价策略的实例和一个使用第二个等价策略的实例会导致问题。

如果你想要不同的等价关系,你应该把它们放在你的类之外。 Equivalence 让您做到这一点:通过实现 Equivalence 并覆盖 doHash()doEquivalent( ) 方法。

然后,当您想使用基于一个等价或另一个等价的 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 自动包装/解包您的元素。

this Guava issue 中有更多信息.

关于java - Google Guava/Equivalence/不同的 equals() 和 hashCode() 方法实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7970231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com