|
|
1
22
一个问题是堆栈是类,而不是接口。这与集合框架的设计不同,集合框架中的名词通常表示为接口(例如,列表、树、集合等),并且有特定的实现(例如,ArrayList、LinkedList)。如果Java可以避免向后兼容性,那么一个更合适的设计是有一个堆栈接口,然后是VectorStack作为一个实现。 第二个问题是堆栈现在绑定到向量,这通常是避免的,有利于数组列表等。 第三个问题是,您不能轻松地提供自己的堆栈实现,并且这些堆栈支持非常非堆栈的操作,例如从特定索引获取元素,包括索引异常的可能性。作为一个用户,您可能还必须知道堆栈的顶部是在索引0还是在索引N。该接口还公开了实现细节,如容量。 在原始Java类库中的所有决策中,我认为这是比较奇怪的一种。我怀疑聚合比继承要贵得多。 |
|
|
2
25
有效Java第二版,第16项:继承优于继承 :
这本书更加详细,并与 第十七条继承或者禁止继承的设计和文件 ,建议不要在设计中过度使用和滥用继承。
下面是一个简单的例子,展示了
这严重违反了堆栈抽象数据类型。 也见
|
|
|
3
6
有
例如,堆栈是一个后进先出的数据结构,但是使用这个实现,您可以调用
我认为乔舒亚·布洛克公开说
|
|
|
4
3
好,
这个
但是,因为
|
|
|
5
2
除了上面提到的主要有效点之外,从向量继承堆栈的另一个大问题是向量是完全同步的,所以无论您是否需要它,您都会得到这种开销(参见StringBuffer和StringBuilder)。就我个人而言,每当我想要一堆的时候,我都倾向于使用arraydeque。 |
|
|
6
1
它违反了我们都学到的关于继承的第一条规则:你能用一个直的脸说一个堆栈是一个向量吗?显然不是。 另一个更合乎逻辑的操作是使用聚合,但最佳选择IMO将是堆栈的接口,可以通过任何适当的数据结构来实现,与C++ STL所做的类似(但不完全相同)。 |