Versuchen, Javas DelayQueue
zu verwenden, muss ich die Delayed
Schnittstelle implementieren, die eine compareTo()
"method that provides an ordering consistent with its getDelay method." erfordert. Die Absicht ist natürlich, dass die DelayQueue
die in der Warteschlange befindlichen Objekte leicht sortieren kann, so dass der nächste, der aus seiner Verzögerung herauskommt, zu jedem Abnehmer zurückgegeben werden kann.Macht java.util.concurrent.Delayed wirklich mich zwingen, Gleichheit/compareTo Konsistenz zu verletzen?
Jetzt muss ich auch Objekte aus der Warteschlange vorzeitig entfernen. Ich muss delayQueue.remove(queuedObject)
anrufen. Dies funktioniert natürlich nur, wenn die Objekte in der Warteschlange eine equals()
-Methode haben, die ihre Nutzlast widerspiegelt, und nicht die vollständig nicht verwandte verbleibende Verzögerungszeit.
Als Ergebnis wird compareTo()
auf der verbleibende Verzögerungszeit basiert, während equals()
auf der Nutzlast der anstehenden Objekte basieren, so dass sie nicht im Einklang, wie es in den javadoc of Comparable
„dringend empfohlen“.
Frage: bin ich etwas fehlt oder ist das in der Tat ein bisschen eine Eigenart im Design von DelayQueue
?
Nun, es ist "dringend empfohlen (obwohl nicht erforderlich)", also würde ich nicht sagen, dass Sie etwas verletzen müssen. Es gibt einige Klassen in JRE, die 'compareTo' inkonsistent mit' equals' sind, einschließlich 'ScheduledFutureTask', die' Delayed' implementiert. – izstas
Siehe auch http://stackoverflow.com/questions/8446736/when-using-the-delayqueue-of-java-should-i-implement-equals-and-hashcode-as – Raedwald