編集:あなたの新しい記述に基づいて、間違った質問をしていると思います。エグゼキュータを使用している場合は、おそらくキューを変更するのではなく、カスタムRejectedExecutionHandlerを定義する必要があります。これは、ThreadPoolExecutorを使用している場合にのみ機能しますが、そうでない場合は、キューではなくExecutorを変更する方が良いでしょう。
オファーをオーバーライドしてaddのように振る舞うのは間違いだと私の意見です。インタフェースメソッドは契約を構成します。ブロッキングキューを使用するクライアントコードは、ドキュメントで指定されているものを実際に実行するメソッドによって異なります。そのルールを破ることは、傷つく世界のために開きます。それ、そしてそれは不愉快です。
BlockingQueues上add()方法はそれを行うが、彼らはまた、一般的により良い選択であるoffer()方法を持っています。提供()のドキュメントから:
挿入、真の成功時に と、この場合はfalseを返し、 キューの容量を超えずにすぐする 可能である場合は、このキューの 末尾に指定された要素キュー がいっぱいです。このメソッドは、通常、メソッドadd(E)よりも好ましくは です。 は、例外をスローすることによって要素を挿入することができません。
これは関係なく、特定の実装(LinkedBlockingQueueなどArrayBlockingQueue、)のようなすべてのキューのために働く
BlockingQueue<String> q = new LinkedBlockingQueue<String>(2);
System.out.println(q.offer("foo")); // true
System.out.println(q.offer("bar")); // true
System.out.println(q.offer("baz")); // false
それに問題があなたのサブクラスのadd()メソッドは、現在、基本クラスのadd()に異なった動作をすることをある:
おっとより、私の残りのコメントを参照してください。 – PaulJWilliams
@Visage:うん、そうだけど、ときどき、うまくいくには良いデザイン原則に違反しなければならない。この場合、私は、この「非標準」クラスが非常に狭い文脈で使用されていることを作者が確かめることを期待しています(そして期待します)。確かに公開APIで公開するのは悪い考えです。 –