2014-06-22 12 views
8

Cercando di utilizzare Java DelayQueue, devo implementare l'interfaccia Delayed che richiede un compareTo()"method that provides an ordering consistent with its getDelay method.". L'intenzione è ovviamente che lo DelayQueue possa facilmente ordinare gli oggetti in coda in modo tale che il successivo che esaurisce il ritardo possa essere restituito a qualsiasi utente.java.util.concurrent.Delayed mi costringe davvero a violare equals/compare To consistency?

Ora ho la necessità di rimuovere anche gli oggetti dalla coda prima del tempo. Devo chiamare lo delayQueue.remove(queuedObject). Questo ovviamente funziona solo se gli oggetti in coda hanno un metodo equals() che riflette il loro carico utile e non il tempo di ritardo rimanente completamente non correlato.

Come risultato, compareTo() si basa sul tempo di ritardo rimanente mentre equals() si basa sul carico degli oggetti in coda, quindi non sono coerenti, come "fortemente raccomandato" nel javadoc of Comparable.

Domanda: mi manca qualcosa o è davvero un po 'strano nella progettazione di DelayQueue?

+3

Bene, è "fortemente consigliato (anche se non obbligatorio)", quindi non direi che devi violare qualcosa. Ci sono alcune classi in JRE che presentano 'compareTo' incoerente con' equals', incluso 'ScheduledFutureTask' che implementa' Delayed'. – izstas

+1

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

risposta

0

La sala di prova disponibile può essere nell'ambiguità del requisito che l'ordine è coerente con il suo metodo getDelay. Cosa significa coerente? Può significare utilizzare i valori getDelay come ordinamento principale e consentire l'utilizzo di altri attributi come ordine secondario per interrompere i legami per gli oggetti che hanno valori equivalenti getDelay? Se è così, si andrebbe bene se il metodo equals richiede l'uguaglianza dei valori getDelay e tutti gli attributi che il metodo compareTo utilizza per il tie break, ma non richiede l'uguaglianza di altri attributi. Ciò significa in realtà che la classe Delayed deve avere semantica del valore.

0

Che due oggetti non siano sufficientemente diversi da giustificare il posizionamento uno sopra l'altro non implica che gli oggetti siano identici. Come semplice esempio, si potrebbe desiderare di ordinare le stringhe usando un confronto di stringhe senza distinzione tra maiuscole e minuscole, ma considerano solo due stringhe come equivalenti quando il loro utilizzo in maiuscolo/minuscolo corrisponde. Secondo tali standard, "FRED" e "Fred" non sarebbero disuguali, ma non sarebbero correlati l'uno rispetto all'altro. Suggerirei che è più importante che equals indichi l'equivalenza semantica piuttosto che essere "coerente" con compareTo.