尝试使用Java DelayQueue
,我必须实现需要Delayed
"method that provides an ordering consistent with its getDelay method."的compareTo()
界面。当然,目的是DelayQueue
可以轻松地对排队的对象进行排序,以便下一个延迟的对象可以返回给任何接受者。
现在我还需要提前从队列中删除对象。我需要致电delayQueue.remove(queuedObject)
。这当然只有在排队的对象具有反映其有效负载的equals()
方法而不是完全不相关的剩余延迟时间时才有效。
因此,compareTo()
基于剩余延迟时间,而equals()
基于排队对象的有效负载,因此它们不一致,强烈推荐" 34;在javadoc of Comparable
。
问题:我错过了什么,或者这在设计DelayQueue
时确实有点怪癖?
答案 0 :(得分:0)
可用的摆动空间可能与使用getDelay
方法排序一致的要求不明确。 一致是什么意思?它是否意味着使用getDelay
值作为主要排序,并允许使用其他属性作为辅助排序,以打破具有等效getDelay
值的对象的关联?如果是这样,如果equals
方法要求getDelay
值与compareTo
方法用于打破平局的所有属性相等,但不要求任何其他属性相等,则可以。属性。这实际上意味着Delayed
类必须具有值语义。
答案 1 :(得分:0)
两个对象之间的差别不足以证明排名一个在另一个之上,并不意味着对象是相同的。举个简单的例子,可能希望使用不区分大小写的字符串比较对字符串进行排序,但只有当两个字符串的大写/小写用法匹配时才将它们视为等效字符串。按照这样的标准,“FRED”和“Fred”不会是不平等的,但相对于彼此不会是不相同的。我建议让equals
表示语义等价比让它与compareTo
“一致”更重要。