web-dev-qa-db-fra.com

Java Files d'attente - pourquoi "interroger" et "offrir"?

Ok, donc j'utilise Java depuis longtemps maintenant et je me suis récemment préparé pour mon examen OCJP. Je me demandais si quelqu'un pourrait fournir des informations sur pourquoi les noms de méthode "poll" (par opposition à la "pop" plus traditionnelle) et "offer" (par opposition à la plus traditionnelle "Push") ont été choisis? Je regarde spécifiquement l'interface Java.util.Queue, mais je serais également intéressé par des explications plus générales :)

C'est vraiment plus une question académique que pour tout scénario de codage spécifique, car j'essaie simplement de comprendre pourquoi Sun (comme cela a été fait avant qu'Oracle ne les achète) choisirait les noms qu'ils ont choisis.

Oh et avant que quelqu'un décide de me crucifier ou de renvoyer des liens vers lmgtfy ... J'ai déjà regardé sur google, yahoo, wiki, bing et SO donc si j'oublie certains éléments évidents critères de recherche ou raté un vieux post ici qui l'explique alors je m'excuse à l'avance.

32
zpangwin

Parce que ces méthodes ont une sémantique différente expliquée dans le JavaDoc . add/remove sont inconditionnelles tandis que offer/poll renvoient une valeur spéciale :

  • offer uniquement offre une nouvelle valeur, mais elle pourrait ne pas être acceptée, par exemple si la file d'attente est pleine

  • poll uniquement interroge la valeur, mais nous acceptons le fait que la valeur ne soit pas là.

Pour compliquer davantage les choses, BlockingQueue introduit encore une autre paire de méthodes pour bloquer add/remove. Bien sûr, ils auraient pu utiliser le même nom avec un tas de paramètres/drapeaux,

smellyGet(boolean blocking, boolean failOnEmpty)

mais ne pensez-vous pas que c'est une meilleure conception?

        | Throws ex. | Special v. | Blocks | Times out
--------+------------+------------+--------+---------------------
Insert  | add(e)     | offer(e)   | put(e) | offer(e, time, unit)
Remove  | remove()   | poll()     | take() | poll(time, unit)
Examine | element()  | peek()     | N/A    | N/A

* https://meta.stackexchange.com/questions/73566

35
Tomasz Nurkiewicz

Vous confondez file d'attente avec pile; Le push et le pop sont associés à ce dernier.

Pensez à la file d'attente dans son bon contexte producteur/consommateur; sondage et offre auront beaucoup plus de sens.

9
duffymo

L'interface Queue définit certaines méthodes pour agir sur le premier élément de la liste, qui diffèrent par leur comportement. Ces méthodes sont:

peek()
element()
poll()
remove()

The peek () Cette méthode récupère la valeur du premier élément de la file d'attente sans le supprimer de la file d'attente. Pour chaque appel de la méthode, nous obtenons toujours la même valeur et son exécution n'affecte pas la taille de la file d'attente. Si la file d'attente est vide, la méthode peek () renvoie null.

L'élément () Cette méthode se comporte comme peek (), donc elle récupère à nouveau la valeur du premier élément sans la supprimer. cependant, si la liste est vide, element () lève une NoSuchElementException.

The poll () Cette méthode récupère la valeur du premier élément de la file d'attente en le supprimant de la file d'attente. . A chaque invocation, il supprime le premier élément de la liste et si la liste est déjà vide, elle retourne null mais ne lève aucune exception.

The remove () Cette méthode se comporte comme la méthode poll (), elle supprime donc le premier élément de la liste et si la liste est vide, elle lève une NoSuchElementException

3
dinesh kandpal

Je suppose que c'est simplement parce que les noms Push et pop semblent ambigus entre le comportement de add et remove et celui de offer et poll - et pop, en particulier, rappelle Java.util.Stack.pop(), qui se comporte comme remove plutôt que comme poll. Les noms add et remove ont évidemment été choisis pour correspondre aux noms de méthodes similaires ailleurs dans le Java Collections Framework, qui soit effectuer l'opération demandée, soit lever une exception, les noms offer et poll suggèrent qu'ils ne déclenchent pas d'exceptions.

1
ruakh