Wenn ich versuche, DelayQueue
von Java zu verwenden, muss ich die Schnittstelle Delayed
implementieren, für die ein compareTo()
"Methode, die eine Reihenfolge liefert, die mit der getDelay-Methode übereinstimmt. . 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 ausgeht, an einen beliebigen Nehmer zurückgegeben werden kann.
Jetzt muss ich auch Objekte aus der Warteschlange entfernen. Ich muss delayQueue.remove(queuedObject)
aufrufen. Dies funktioniert natürlich nur, wenn die Objekte in der Warteschlange eine equals()
-Methode haben, die ihre Nutzlast und nicht die vollständig nicht verwandte verbleibende Verzögerungszeit widerspiegelt.
Daher basiert compareTo()
auf der verbleibenden Verzögerungszeit, während equals()
auf der Nutzlast der Objekte in der Warteschlange basiert. Daher sind sie nicht konsistent, wie es in javadoc von Comparable
.
Frage: Fehle ich etwas oder ist das in der Tat eine Art Eigenart im Design von DelayQueue
?
Der verfügbare Wiggle-Raum befindet sich möglicherweise in der Ambiguität der Anforderung, dass die Reihenfolge konsistent mit der Methode getDelay
ist. Was bedeutet konsistent ? 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 zu trennen, die äquivalente getDelay
-Werte haben? Wenn dies der Fall ist, wäre es in Ordnung, wenn die equals
-Methode die Gleichheit der getDelay
-Werte und aller Attribute, die die compareTo
-Methode für das Brechen verwendet, erfordert, aber keine Gleichheit irgendwelcher anderer Attribute erfordert. Das bedeutet, dass die Delayed
-Klasse eine Wertesemantik haben muss.
Dass zwei Objekte nicht ausreichend verschieden sind, 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, dass equals
semantische Äquivalenz anzeigt, als dass es "konsistent" mit compareTo
ist.
Tags und Links java concurrency equals compareto