試圖使用Java的DelayQueue
,我必須實現Delayed
接口,它需要一個compareTo()
"method that provides an ordering consistent with its getDelay method."。目的當然是DelayQueue
可以很容易地對排隊的對象進行排序,以便延遲的下一個可以返回給任何接受者。java.util.concurrent.Delayed是否真的迫使我違反equals/compareTo一致性?
現在我還需要提前從隊列中刪除對象。我需要致電delayQueue.remove(queuedObject)
。這當然只適用於排隊的對象有一個反映它們的有效載荷的方法,而不是完全不相關的剩餘延遲時間的equals()
方法。
結果,compareTo()
是基於剩餘延遲時間,而equals()
基於排隊的對象的有效載荷,所以他們並不一致,如「強烈推薦」的javadoc of Comparable
。
問題:我錯過了什麼,或者這在DelayQueue
的設計中確實有點怪誕嗎?
嗯,它是「強烈建議(雖然不是必需的)」,所以我不會說你必須違反某些東西。 JRE中有一些類的'compareTo'與'equals'不一致,包括'ScheduledFutureTask',它實現'Delayed'。 – izstas
另請參閱http://stackoverflow.com/questions/8446736/when-using-the-delayqueue-of-java-should-i-implement-equals-and-hashcode-as – Raedwald