看来,设计类的时候将方法定义成final的,会是一个很明智的决定。可能你会觉得没人要覆写你的方法,有时确实是这样。但是你这么假设的时候一定要非常谨慎。一般来说,要实现预想“类会怎样被复用”是非常困难的,特别是对那些很通用的类来说。如果你把类定义成final的,那么很可能会发生这种情况,由于你没有料到这个类还能被这么使用,其它项目的程序要就没法通过继承来复用这个类了。
标准Java类库就是一个活生生的例子。特别是vector类,这个类曾被广泛使用,如果不是为了追求效率而把它的所有方法都做成final的话,它的用途可能会更广。这个类太有用了,因此应该很容易向导会有人要继承它并且覆写其中的方法,但是类的设计者们不知怎么搞的,认定这么做是不对的。有两个理由使得这种想法变得非常具有讽刺意味。
首先,stack是继承子vector的,也就是说stack就是vector,但是在逻辑上这种说法并不正确。第二,vector的很多重要的方法,比如addElement()等,都是synchronized。这样做会造成很严重的性能下降,并且完全抵消final所带来的优化。这更让我们相信了,程序员在猜测该在哪里做优化的时候总是犯错。在标准类库里面房间如此笨拙的设计是在是太糟糕了,但是大家都还不得不迁就。