Java Queues - почему «опрос» и «предложение»? - PullRequest
32 голосов
/ 18 февраля 2012

Хорошо, я давно использую Java и недавно готовился к экзамену OCJP.Мне было интересно, сможет ли кто-нибудь дать какое-либо представление о , почему называет методы «poll» (в отличие от более традиционных «pop») и «offer» (в противоположностьчтобы более традиционные "толчки") были выбраны?Я специально смотрю на интерфейс java.util.Queue, но мне также могут быть интересны более общие пояснения:)

Это действительно более академический вопрос, чем для любого конкретного сценария кодирования, так как я 'Я просто пытаюсь понять, почему Sun (как это было сделано до того, как Oracle купил их) выбрала имена, которые они сделали.

О, и прежде чем кто-нибудь решит распять меня или выбросить ссылки на lmgtfy ..Я уже посмотрел на Google, Yahoo, Wiki, Bing и т.д., так что, если я пропускаю некоторые очевидные критерии поиска или пропустил какой-то старый пост, который объясняет это, тогда я заранее извиняюсь.

Ответы [ 4 ]

34 голосов
/ 18 февраля 2012

Поскольку эти методы имеют различную семантику, объясненную в JavaDoc .add / remove являются безусловными, а offer / poll возвращают специальное значение :

  • offer только предлагает новое значение, но оно может быть не принято, например, если очередь заполнена

  • poll только опрашивает для значения, но мы принимаем тот факт, чтозначение может отсутствовать.

Чтобы еще больше усложнить ситуацию, BlockingQueue вводит еще одну пару методов для блокировки add / remove.Конечно, они могли бы использовать то же имя с набором параметров / флагов,

smellyGet(boolean blocking, boolean failOnEmpty)

, но вы не думаете, что это лучший дизайн?

        | 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

8 голосов
/ 18 февраля 2012

Вы путаете Очередь со Стеком;push и pop связаны с последним.

Думайте об очереди в соответствующем контексте производителя / потребителя;опрос и предложение будут иметь гораздо больше смысла.

3 голосов
/ 28 марта 2017

Интерфейс очереди определяет некоторые методы для работы с первым элементом списка, которые отличаются по поведению.Это следующие методы:

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

Peek () Этот метод извлекает значение первого элемента очереди, не удаляя его из очереди.Для каждого вызова метода мы всегда получаем одно и то же значение, и его выполнение не влияет на размер очереди. Если очередь пуста, метод peek () возвращает ноль .

Элемент () Этот метод ведет себя как peek (), поэтому он снова получает значениепервый элемент, не удаляя его.однако, если список пустой элемент () выдает исключение NoSuchElementException .

poll () Этот метод извлекает значение первого элемента очереди путем удаленияэто из очереди.,При каждом вызове он удаляет первый элемент списка и, если список уже пуст, он возвращает ноль, но не выдает никаких исключений .

Remove () Этот метод работает как метод poll (), поэтому он удаляет первый элемент списка и , если список пуст, выдает исключение NoSuchElementException

1 голос
/ 18 февраля 2012

Полагаю, это просто потому, что имена push и pop звучат неоднозначно между поведением add и remove и offer и poll - и pop, в частностинапоминает java.util.Stack.pop(), который ведет себя как remove, а не как poll.Имена add и remove, очевидно, были выбраны, чтобы соответствовать именам аналогичных методов в других местах в Java Collections Framework, которые либо выполняют запрошенную операцию, либо вызывают исключение;имена offer и poll свидетельствуют о том, что они не вызывают исключений.

...