質問
メソッドjava.util.concurrent.blockingqueue.add(e e) 's javadocが読む:
ブールアディング(e e)
容量制限に違反することなくすぐにそうすることができる場合は、指定された要素をこのキューに挿入し、成功したときに真に戻り、スペースが現在利用できない場合は違法な標準を投げます。容量制限キューを使用する場合、一般的にオファーを使用することが望ましいです。
私の質問は次のとおりです。それは偽りを返すでしょうか?そうでない場合、なぜこの方法がブール値を返すのですか?私には奇妙に思えます。この背後にあるデザインの決定は何ですか?
あなたの知識をありがとう!
マヌエル
解決
その契約に続きます Collection.add(E e)
(以来 BlockingQueue
のサブタイプです Collection
):
コレクションが、要素が既に含まれていること以外の理由で特定の要素を追加することを拒否した場合、例外をスローする必要があります(falseを返すのではなく)。これにより、この呼び出しが返された後、コレクションに指定された要素が常に含まれるという不変が保護されます。
他のヒント
背後にある決定は次のとおりです。キューの容量が限られている場合、IllegalStateExceptionはスローされます。 IllegalStateExceptionはruntimeexceptionです。したがって、例外がスローされた場合、おそらくアプリケーションロジックに障害があるか、アプリケーションロジックが十分に防御的ではありません。または、言い換えればそれを言うには:限られたキューを使用するのが好きなら、アプリケーションはそれを適切に処理する必要があります(使用してください offer
代わりは)。
それはのサブインターフェイスであるため、ブールリターンタイプがあると思います Queue
, 、それもあります boolean add(E obj)
メソッド(次に派生します Collection
)。特定 Queue
実装は、falseを返すことにより、キューにオブジェクトを追加しようとする試みを拒否します。
したがって、あなたの質問に対する答えは、BlockingQueueの実装が虚偽を返すことは決してないということです。
このメソッドは、オーバーライドするため、ブール値を返します Collection#add(E e)
.