提问人:Harald 提问时间:6/23/2014 更新时间:7/26/2014 访问量:927
java.util.concurrent.Delayed 真的会迫使我违反 equals/compareTo 一致性吗?
Does java.util.concurrent.Delayed really force me to violate equals/compareTo consistency?
问:
尝试使用 Java 的 ,我必须实现需要“提供与其 getDelay 方法一致的排序的方法”的接口。当然,其目的是可以轻松地对排队的对象进行排序,以便下一个延迟过的对象可以返回给任何接受者。DelayQueue
Delayed
compareTo()
DelayQueue
现在,我还需要提前从队列中删除对象。我需要打电话给.当然,只有当排队的对象具有反映其有效负载的方法而不是完全不相关的剩余延迟时间时,这才有效。delayQueue.remove(queuedObject)
equals()
因此,它基于剩余的延迟时间,而基于排队对象的有效负载,因此它们并不一致,正如 Comparable
的 javadoc 中的“强烈推荐”一样。compareTo()
equals()
问题:我是否遗漏了什么,或者这确实是设计中的一点怪癖?DelayQueue
答:
可用的回旋余地可能在于要求排序与其方法一致的模糊性。consistent 是什么意思?这是否意味着使用值作为主要排序,并允许使用其他属性作为次要排序,以中断具有等效值的对象的联系?如果是这样,如果该方法要求该方法用于打破平局的值和所有属性相等,但不要求任何其他属性相等,则可以。这实际上意味着类必须具有值语义。getDelay
getDelay
getDelay
equals
getDelay
compareTo
Delayed
两个对象的差异不足以证明将一个对象排在另一个对象之上并不意味着这两个对象是相同的。举个简单的例子,人们可能希望使用不区分大小写的字符串比较对字符串进行排序,但只有当两个字符串的大写/小写用法匹配时,才将两个字符串视为等效字符串。按照这样的标准,“FRED”和“Fred”不会不平等,但相对于彼此来说是没有排名的。我认为,指示语义等价比让它与 “一致”更重要。equals
compareTo
评论
compareTo
equals
ScheduledFutureTask
Delayed