尝试使用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
类必须具有值语义。