1

我刚刚在研究 JDK 1.6 时发现ArrayBlockingQueue- 构造函数调用了一种公共可重写方法!我认为这对于 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, 并添加一些 state 和 overrided ,当我调用构造函数时add()我立即得到了。我在这里错过了一些设计概念吗?java.lang.NullPointerExceptionsuper(capacity,fair,col)

4

1 回答 1

2

这并没有什么不寻常的。本质上,您可以将其视为行的单行语法

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

这是可以覆盖的。调用可覆盖的方法通常不是一个好主意,但在这里它是完全合理的。

但是......也就是说,从java.utilor扩展任何集合java.util.concurrent是一种邪恶。你应该装饰它们,而不是直接扩展它们。

于 2012-05-29T16:21:02.640 回答