java - java.util.concurrent.Delayed 真的迫使我违反 equals/compareTo 一致性吗?

标签 java concurrency equals compareto

尝试使用 Java 的 DelayQueue,我必须实现 Delayed 接口(interface),它需要一个 compareTo() "method that provides an ordering consistent with its getDelay method." .目的当然是 DelayQueue 可以轻松地对排队的对象进行排序,以便下一个用完延迟的对象可以返回给任何接受者。

现在我还需要提前从队列中删除对象。我需要调用 delayQueue.remove(queuedObject)。这当然只有在排队的对象有一个 equals() 方法来反射(reflect)它们的有效负载而不是完全不相关的剩余延迟时间时才有效。

因此,compareTo()是基于剩余延迟时间而equals()是基于排队对象的payload,所以两者不一致,正如 javadoc of Comparable 中的“强烈推荐” .

问题:我是否遗漏了什么,或者这确实是 DelayQueue 设计中的一个怪癖?

最佳答案

可用的回旋余地可能与要求的模糊性有关,即排序与其 getDelay 方法一致一致 是什么意思?这是否意味着使用 getDelay 值作为主要排序,并允许使用其他属性作为次要排序,以打破具有等效 getDelay 值的对象的关系?如果是这样,如果 equals 方法要求 getDelay 值和 compareTo 方法用于打破平局的所有属性相等,那么您就可以了,但不需要任何其他属性相等。这实际上意味着 Delayed 类必须具有值语义。

关于java - java.util.concurrent.Delayed 真的迫使我违反 equals/compareTo 一致性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24353212/

相关文章:

java - Exe4J 返回异常“?

java - 仅将 JButton 添加到 JTable 中的某些行和列

java map并发更新

java - 除了不可变值对象之外,我什么时候应该覆盖 `equals()` ?

java - "javax.naming.NoInitialContextException"是什么意思?

java - 在JOOQ中将RDS数据写入磁盘

java - 多线程旧版Java应用程序的线程按顺序轮流

使用 ConcurrentHashMap 进行 Kotlin 并发,同时在不使用锁的情况下检索和删除

Java : equals() and === on String and int variables

java - 使用 Comparator 而不是 equals() 来比较两个 Java 集合