【问题标题】:Java Queues - why "poll" and "offer"?Java 队列 - 为什么是“poll”和“offer”?
【发布时间】:2012-03-09 17:28:41
【问题描述】:

好的,所以我已经使用 Java 很长时间了,最​​近一直在准备我的 OCJP 考试。我想知道是否有人能够提供任何关于为什么方法名称为“poll”(而不是更传统的“pop”)和“offer”(与更传统的“推”相反)被选择了吗?我正在专门研究 java.util.Queue 接口,但也会对更一般的解释感兴趣:)

这实际上是一个学术问题,而不是任何特定的编码场景,因为我只是想弄明白为什么 Sun(因为这是在 Oracle 收购它们之前完成的)会选择他们所做的名称。

哦,在任何人决定将我钉在十字架上或放弃指向 lmgtfy 的链接之前...在这里发帖解释一下,然后我提前道歉。

【问题讨论】:

  • 队列可以为空。空堆栈上的弹出操作没有多大意义,因此将其称为“轮询”更有意义 - 如果可用,则获取某些内容,否则什么也不做。
  • 这更有意义......我一直在比较 Stack 和 C++ std 类的堆栈和队列(更不用说 JS 中的数组,哈哈)。在 duffymo、Tomasz 和 ruakh 的回答之间——并且更彻底地查看 api 描述——我想我明白他们为什么选择避免使用 Queue 的名称“push”和“pop”。感谢大家的精彩回复!

标签: java naming


【解决方案1】:

因为这些方法在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

【讨论】:

    【解决方案2】:

    您将队列与堆栈混淆了; push 和 pop 与后者相关联。

    在适当的生产者/消费者上下文中考虑队列;投票和报价会更有意义。

    【讨论】:

    • 我不完全同意。确实,pushpop 与堆栈密切相关,但它们也经常与队列一起使用;例如,C++ 的std::queuepushpop
    • @ruakh 我想他提到了Java,即没有poppush 用于Stack 数据结构。无论如何,问题是关于 Java 的
    【解决方案3】:

    Queue 接口定义了一些作用于列表第一个元素的方法,它们的行为方式不同。 这些方法是:

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

    偷看() 此方法检索队列的第一个元素的值,而不将其从队列中删除。对于方法的每次调用,我们总是得到相同的值,并且它的执行不会影响队列的大小。 如果队列为空,则 peek() 方法返回 null

    元素() 此方法的行为类似于 peek(),因此它再次检索第一个元素的值而不删除它。但是,如果列表为空 element() 抛出 NoSuchElementException

    投票() 此方法通过从队列中删除队列的第一个元素来检索它的值。 .在每次调用时,它都会删除列表的第一个元素,如果列表已经为空,则返回 null 但不会抛出任何异常

    remove() 此方法的行为类似于 poll() 方法,因此它会删除列表的第一个元素,如果列表为空,则会抛出 NoSuchElementException

    【讨论】:

      【解决方案4】:

      我认为这仅仅是因为 pushpop 的名称在 addremove 的行为与 offerpoll 的行为之间听起来模棱两可,尤其是 pop 是让人想起java.util.Stack.pop(),它的行为类似于remove,而不是poll。名称addremove 显然是为了匹配Java Collections Framework 中其他地方的类似方法的名称,它们要么执行请求的操作,要么引发异常; offerpoll 的名称暗示了它们不会引发异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-13
        • 2021-05-07
        • 1970-01-01
        • 2020-11-26
        • 2016-02-24
        • 1970-01-01
        • 1970-01-01
        • 2010-10-24
        相关资源
        最近更新 更多