我刚刚在学习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)
。我在这里错过了一些设计概念吗?
答案 0 :(得分:2)
这并非如此与众不同;实际上,您可以将其视为行
的单行语法ArrayBlockingQueue<E> queue = new ArrayBlockingQueue<E>(capacity, fair);
queue.addAll(c);
是可以覆盖的。调用可覆盖的方法通常不是一个好主意,但这里完全合理。
但是......说,从java.util
或java.util.concurrent
扩展任何收藏都是邪恶的。你应该装饰它们,而不是直接扩展它们。