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

时间:2014-06-22 16:22:22

标签: java concurrency equals compareto

尝试使用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时确实有点怪癖?

2 个答案:

答案 0 :(得分:0)

可用的摆动空间可能与使用getDelay方法排序一致的要求不明确。 一致是什么意思?它是否意味着使用getDelay值作为主要排序,并允许使用其他属性作为辅助排序,以打破具有等效getDelay值的对象的关联?如果是这样,如果equals方法要求getDelay值与compareTo方法用于打破平局的所有属性相等,但不要求任何其他属性相等,则可以。属性。这实际上意味着Delayed类必须具有值语义。

答案 1 :(得分:0)

两个对象之间的差别不足以证明排名一个在另一个之上,并不意味着对象是相同的。举个简单的例子,可能希望使用不区分大小写的字符串比较对字符串进行排序,但只有当两个字符串的大写/小写用法匹配时才将它们视为等效字符串。按照这样的标准,“FRED”和“Fred”不会是不平等的,但相对于彼此不会是不相同的。我建议让equals表示语义等价比让它与compareTo“一致”更重要。