1

JDK 1.6の調査中に見つけたばかりですArrayBlockingQueue-コンストラクターは、パブリックのオーバーライド可能なメソッドの1つを呼び出します!これは特にAPIにとっては悪い習慣だと思いました。

 public ArrayBlockingQueue(int capacity, boolean fair,
                          Collection<? extends E> c) {
    this(capacity, fair);
    if (capacity < c.size())
        throw new IllegalArgumentException();

    for (Iterator<? extends E> it = c.iterator(); it.hasNext();)
        add(it.next()); // -> surprise:  add is public 
}

私は実際にを拡張しようとしていてArrayBlockingQueue、いくつかの状態を追加してオーバーライドしましたが、コンストラクターを呼び出すadd()とすぐに取得しました。ここにいくつかのデザインコンセプトが欠けていますか?java.lang.NullPointerExceptionsuper(capacity,fair,col)

4

1 に答える 1

2

これはそれほど珍しいことではありません。基本的に、これは行の1行の構文と考えることができます。

ArrayBlockingQueue<E> queue = new ArrayBlockingQueue<E>(capacity, fair);
queue.addAll(c);

これはオーバーライド可能です。オーバーライド可能なメソッドを呼び出すことは通常は良い考えではありませんが、ここでは完全に合理的です。

しかし...そうは言っても、コレクションを拡張することは、java.utilまたはjava.util.concurrent一種の悪です。それらを直接拡張するのではなく、装飾する必要があります。

于 2012-05-29T16:21:02.640 に答える