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

Har*_*ald 9 java concurrency equals compareto

尝试使用Java DelayQueue,我必须实现Delayed需要compareTo() "提供与其getDelay方法一致的排序的方法"的接口..当然,目的是DelayQueue可以轻松地对排队的对象进行排序,使得下一个延迟的对象可以返回给任何接受者.

现在我还需要提前从队列中删除对象.我需要打电话delayQueue.remove(queuedObject).这当然只有在排队的对象具有equals()反映其有效载荷的方法而不是完全不相关的剩余延迟时间时才有效.

因此,compareTo()基于剩余延迟时间而equals()基于排队对象的有效负载,因此它们不一致,正如javadoc中Comparable "强烈推荐"的那样.

问题:我错过了什么,或者这在设计中确实有点怪癖DelayQueue

Rae*_*ald 0

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