Java Google Guava/equality/different equals()和hashCode()方法实现

Java Google Guava/equality/different equals()和hashCode()方法实现,java,guava,Java,Guava,我希望能够在两个equals实现之间切换,但我不确定Google Guava的equality类是否提供了此功能。假设我有两个equals方法equalsContent()和equalsKeys()或者类似的东西,我想将equals方法委托给两个私有方法中的一个(两个hashCode方法也是如此) 嗯,我不知何故不确定等价抽象类和等价类(静态方法)的用法是什么 此外,您将如何实现上述所需的属性?我可以使用另一种方法,只需将标志或枚举设置为该值,并使用两个抽象方法(equals(),hashCod

我希望能够在两个equals实现之间切换,但我不确定Google Guava的
equality
类是否提供了此功能。假设我有两个equals方法equalsContent()和equalsKeys()或者类似的东西,我想将equals方法委托给两个私有方法中的一个(两个hashCode方法也是如此)

嗯,我不知何故不确定
等价
抽象类和
等价
类(静态方法)的用法是什么


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

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

如果你想要不同的等价关系,你应该把它们排除在你的类之外<代码>等价
允许您这样做:通过实现等价并重写
doHash()
doEquivalent()
方法来提取等价逻辑(equals()/hashCode())

然后,当您想基于一种等价物或另一种等价物使用
集合时,可以使用
等价物.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.
Set identityHashSet=Sets.newHashSet();
字符串a1=“a”;
字符串a2=新字符串(“a”);
字符串b=“b”;
identityHashSet.add(Equivalences.identity().wrap(a1));
identityHashSet.add(Equivalences.identity().wrap(a2));
identityHashSet.add(Equivalences.identity().wrap(a3));
//identityHashSet包含“a”、“a”和“b”
//标准哈希集只能包含“a”和“b”
//根据String.equals(),a1和a2是相等的,但它们是不同的实例。
当然,您可以使用
ForwardingSet
自动包装/展开元素


中有更多信息。

是的,谢谢,我甚至不知道包装,但可能是因为我刚刚将番石榴从r09更新为10;-)如何使用
ForwardingSet
自动包装/展开?如果您的类扩展了
ForwardingSet
,那么它也不能实现
Set
。这一点很好。您需要自己实现转发模式<不过,代码>转发集
在这样做时可能会成为一个有用的灵感。