2014-06-22 10 views
8

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?

+3

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

+1

Siehe auch http://stackoverflow.com/questions/8446736/when-using-the-delayqueue-of-java-should-i-implement-equals-and-hashcode-as – Raedwald

Antwort

0

Der verfügbare Spielraum kann in der Mehrdeutigkeit der Anforderung sein, dass die Bestellung konsistent mit seiner getDelay Methode ist. Was bedeutet konsistent bedeuten? Kann es bedeuten, die getDelay Werte als primäre Sortierung zu verwenden und die Verwendung anderer Attribute als sekundäre Sortierung zuzulassen, um Bindungen für Objekte aufzubrechen, die äquivalente getDelay Werte haben? Wenn ja, wären Sie in Ordnung, wenn die Methode equals die Gleichheit der getDelay Werte und alle Attribute erfordert, die die compareTo-Methode für das Brechen verwendet, aber keine Gleichheit irgendwelcher anderer Attribute erfordert. Das bedeutet, dass die Delayed Klasse eine Wertesemantik haben muss.

0

Dass zwei Objekte zu wenig voneinander abweichen, um eine Rangfolge zu rechtfertigen, impliziert nicht, dass die Objekte identisch sind. Als ein einfaches Beispiel möchte man vielleicht Strings mit einem String-Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung sortieren, aber nur zwei Strings als äquivalent betrachten, wenn ihre Groß-/Kleinschreibung übereinstimmt. Nach diesen Standards würden "FRED" und "Fred" nicht ungleich sein, würden aber relativ zueinander nicht bewertet. Ich würde vorschlagen, dass es wichtiger ist, equals semantische Äquivalenz anzuzeigen, als es "konsistent" mit compareTo zu haben.

Verwandte Themen