Java:用于确定等价性的外部类?

Java:用于确定等价性的外部类?,java,guava,equivalence-classes,Java,Guava,Equivalence Classes,Java有一个用于提供类本身外部对象的比较的方法,以允许多个/备用方法进行有序比较 但是进行无序比较的唯一标准方法是在类中重写equals() 当我想在一个类外部提供多个/备用无序比较时,我应该怎么做?(明显的用例是根据特定属性将集合划分为等价类。) 假设最终用于无序检查(例如,不用于排序或索引),是否可以实现仅检查相等的比较器,如果两个对象相等,则返回0,并返回一个值!=当两个对象不相等时为0?(注意:我不跳上这个解决方案的唯一原因是,从技术上讲,它可以通过不提供满足传递性和对称性的关系来打破

Java有一个用于提供类本身外部对象的比较的方法,以允许多个/备用方法进行有序比较

但是进行无序比较的唯一标准方法是在类中重写
equals()

当我想在一个类外部提供多个/备用无序比较时,我应该怎么做?(明显的用例是根据特定属性将集合划分为等价类。)

假设最终用于无序检查(例如,不用于排序或索引),是否可以实现仅检查相等的
比较器
,如果两个对象相等,则返回0,并返回一个值!=当两个对象不相等时为0?(注意:我不跳上这个解决方案的唯一原因是,从技术上讲,它可以通过不提供满足传递性和对称性的关系来打破
比较器的契约。)

似乎应该有一个
EqualsComparator
标准类或其他东西

(Guava可以处理类似的事情吗?

是的,Guava有接口和类(在Guava 14.0版中删除)

(是的,这在Java中非常有用,但遗憾的是它缺乏。我们确实应该为
HashMap
HashSet
等提供相关选项。)


虽然在某些情况下,
Comparator
可能没问题,但它没有提供对基于哈希的集合很重要的
hashCode
方法。

hmmm。。。两者都被标记为@Beta。@Jason:所以请小心使用:)(最终,
等价性
是一个接口,所以你不会依赖一个可能消失的实现。)我可以保证它不会消失,但它在不断变化。例如,对于即将发布的10.0版,我们将其更改为一个抽象类,并将大部分等价物直接移入其中(并且可能在某个时候完成这项工作)。但是,对于基于任意等价的集合,我显然不相信。Java有太多年的固定假设(以及明确的
收集
契约),要求
等于
。相反,您可以使用
yourEquivalence.wrap(yourObject)
并将包装器存储在集合中;笨重,但清晰。@Kevin是的,很遗憾你们这么想:-)