Java ArrayBlockingQueue设计

时间:2012-05-29 16:17:20

标签: java collections

我刚刚在学习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,添加一些状态并覆盖add(),当我调用java.lang.NullPointerException构造函数时,我立即得到了super(capacity,fair,col)。我在这里错过了一些设计概念吗?

1 个答案:

答案 0 :(得分:2)

这并非如此与众不同;实际上,您可以将其视为行

的单行语法
ArrayBlockingQueue<E> queue = new ArrayBlockingQueue<E>(capacity, fair);
queue.addAll(c);

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

但是......说,从java.utiljava.util.concurrent扩展任何收藏都是邪恶的。你应该装饰它们,而不是直接扩展它们。