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

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

结果,compareTo()基于剩余延迟时间,而equals()基于排队对象的有效负载,因此它们不一致,正如javadoc of Comparable 中“强烈建议”的那样。

问题:我是否缺少某些东西,或者这确实是DelayQueue设计中的一个怪癖?

最佳答案

可用的摆动空间可能在要求其排序与其getDelay方法一致的要求中含混不清。一致是什么意思?这是否意味着将getDelay值用作主要顺序,并允许将其他属性用作次要顺序,以便为具有等效getDelay值的对象打破束缚?如果是这样,那么如果equals方法要求getDelay值和compareTo方法用于平局决胜的所有属性相等,而又不需要任何其他属性相等,则可以。这实际上意味着Delayed类必须具有值语义。

10-08 07:12