方法java.util.concurrent.BlockingQueue.add(E e)的JavaDoc读取:
布尔加法(E e)
将指定的元素插入 这个队列是否可以这样做 立刻没有违反能力 限制,回归真实 成功并投掷 如果没有空格,则为IllegalStateException 目前可用。使用时 容量限制队列,它是 通常优先使用报价。
我的问题是:它会丢失吗?如果没有,为什么这个方法返回一个布尔值? 这对我来说似乎很奇怪。这背后的设计决定是什么?
感谢您的了解!
曼努埃尔
答案 0 :(得分:5)
遵循Collection.add(E e)
的合同(因为BlockingQueue
是Collection
的子类型):
如果集合拒绝添加 出于任何原因的特殊要素 除了它已经包含的 元素,它必须抛出一个 例外(而不是返回 假)。这保留了不变量 一个集合总是包含 此调用后指定的元素 回报。
答案 1 :(得分:2)
背后的决定是:快速失败。如果队列的容量有限,则抛出IllegalStateException。 IllegalStateException是一个RuntimeException。因此,如果抛出异常,您可能在应用程序逻辑中出现故障,或者您的应用程序逻辑不够具有防御性。换句话说:如果您想使用有限的队列,您的应用程序应该正确处理它(改为使用offer
)。
答案 2 :(得分:1)
我猜它有一个布尔返回类型,因为它是Queue
的子接口,它也有一个boolean add(E obj)
方法(后者又来自Collection
)。某些Queue
实现拒绝通过返回false将对象添加到队列的尝试。
因此,您的问题的答案是BlockingQueue的实现永远不会返回false。
答案 3 :(得分:1)
该方法返回一个布尔值,因为它会覆盖Collection#add(E e)
。