4

メソッドjava.util.concurrent.BlockingQueue.add(E e)のJavaDocは次のように読み取ります。

boolean add(E e)

容量制限に違反せずにすぐに実行できる場合は、指定された要素をこのキューに挿入します。成功するとtrueを返し、現在使用可能なスペースがない場合はIllegalStateExceptionをスローします。容量制限のあるキューを使用する場合は、通常、offerを使用することをお勧めします。

私の質問は:それはfalseを返すことはありますか?そうでない場合、なぜこのメソッドはブール値を返すのですか?それは私には奇妙に思えます。この背後にある設計上の決定は何ですか?

あなたの知識をありがとう!
マヌエル

4

4 に答える 4

5

Collection.add(E e)これは(BlockingQueueのサブタイプであるためCollection)のコントラクトに従います。

コレクションがすでに要素を含んでいる以外の理由で特定の要素の追加を拒否した場合、コレクションは(falseを返すのではなく)例外をスローする必要があります。これにより、この呼び出しが戻った後、コレクションに常に指定された要素が含まれるという不変条件が保持されます。

于 2010-11-12T20:19:14.783 に答える
2

背後にある決定は次のとおりです。キューの容量が制限されている場合、IllegalStateExceptionがスローされます。IllegalStateExceptionはRuntimeExceptionです。したがって、例外がスローされた場合は、アプリケーションロジックに障害があるか、アプリケーションロジックが十分に防御されていない可能性があります。言い換えれば、制限されたキューを使用したい場合は、アプリケーションがそれを適切に処理する必要があります(offer代わりに使用してください)。

于 2010-11-12T20:20:17.703 に答える
1

のサブインターフェイスでありQueue、メソッドもあるため、ブール値の戻り型があると思いboolean add(E obj)ます(これはから派生しCollectionます)。特定のQueue実装は、falseを返すことにより、オブジェクトをキューに追加する試みを拒否します。

したがって、あなたの質問に対する答えは、BlockingQueueの実装がfalseを返すことは決してないということです。

于 2010-11-12T20:19:28.333 に答える
1

このメソッドは、をオーバーライドするため、ブール値を返しますCollection#add(E e)

于 2010-11-12T20:19:38.673 に答える