【问题标题】:Java: external class for determining equivalence?Java:确定等价的外部类?
【发布时间】:2011-08-31 15:09:06
【问题描述】:

Java 有一个Comparator<T> 用于提供类本身外部对象的比较,以允许进行有序比较的多个/替代方法。

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

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

假设最终用途是用于无序检查(例如,不用于排序或索引),是否可以实现 Comparator<T>,它只检查是否相等,如果两个对象相等则返回 0,当两个对象相等时返回值 != 0两个物体不相等? (注意:我不采用此解决方案的唯一原因是,从技术上讲,它可以通过不提供满足传递性和对称性的关系来破坏Comparator 的合同。)

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

(番石榴能处理这样的事情吗?)

【问题讨论】:

    标签: java guava equivalence-classes


    【解决方案1】:

    是的,Guava 具有 Equivalence 接口和 Equivalences 类(在 Guava 版本 14.0 中已删除)。

    (是的,它是 在 Java 中非常有用但遗憾地缺乏的东西。我们真的应该为 HashMapHashSet 等提供围绕这个的选项...)

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

    【讨论】:

    • hmmm...虽然两者都被标记为@Beta。
    • @Jason:所以请谨慎使用 :) (最终 Equivalence 是一个接口,所以它不像您依赖一个可能会消失的 实现。)
    • 我可以保证它不会消失,但它在不断变化。例如,对于即将发布的 10.0 版本,我们已将其更改为抽象类,并将大部分 Equivalences 直接移入其中(并且可能会在某个时候完成这项工作)。
    • 至于 collections 建立在任意等价之上,不过,我坚决不相信。 Java 有太多年的根深蒂固的假设(以及明确的Collection 合同)需要equals。相反,您可以使用yourEquivalence.wrap(yourObject) 并将包装器存储在一个集合中; 笨重,但清晰。
    • @Kevin 是的,很遗憾你们这么想 :-) code.google.com/p/guava-libraries/issues/detail?id=576
    猜你喜欢
    • 2013-02-07
    • 2014-01-22
    • 2018-09-05
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多