Erzwingt mich java.util.concurrent.Delayed wirklich, die Gleichheit / compareTo Konsistenz zu verletzen?

8

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 ?

    
Harald 22.06.2014, 16:22
quelle

2 Antworten

0

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.

    
Raedwald 26.06.2014 23:04
quelle
0

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.

    
supercat 25.07.2014 22:53
quelle

Tags und Links