尝试使用 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/