設(shè)計(jì)一個(gè)類時(shí),往往需要考慮是否將一個(gè)方法設(shè)為final。可能會(huì)覺(jué)得使用自己的類時(shí)執(zhí)行效率非常重要,
沒(méi)有人想覆蓋自己的方法。這種想法在某些時(shí)候是正確的。
但要慎重作出自己的假定。通常,我們很難預(yù)測(cè)一個(gè)類以后會(huì)以什么樣的形式再生或重復(fù)利用。常規(guī)用途的
類尤其如此。若將一個(gè)方法定義成final,就可能杜絕了在其他程序員的項(xiàng)目中對(duì)自己的類進(jìn)行繼承的途
徑,因?yàn)槲覀兏緵](méi)有想到它會(huì)象那樣使用。
標(biāo)準(zhǔn)Java 庫(kù)是闡述這一觀點(diǎn)的最好例子。其中特別常用的一個(gè)類是Vector。如果我們考慮代碼的執(zhí)行效
率,就會(huì)發(fā)現(xiàn)只有不把任何方法設(shè)為final,才能使其發(fā)揮更大的作用。我們很容易就會(huì)想到自己應(yīng)繼承和
覆蓋如此有用的一個(gè)類,但它的設(shè)計(jì)者卻否定了我們的想法。但我們至少可以用兩個(gè)理由來(lái)反駁他們。首
先,Stack(堆棧)是從Vector 繼承來(lái)的,亦即Stack“是”一個(gè)Vector,這種說(shuō)法是不確切的。其次,對(duì)
于Vector 許多重要的方法,如addElement()以及elementAt()等,它們都變成了synchronized(同步
的)。正如在第14 章要講到的那樣,這會(huì)造成顯著的性能開(kāi)銷,可能會(huì)把final 提供的性能改善抵銷得一干電腦常識(shí)www.boydavid.com
二凈。因此,程序員不得不猜測(cè)到底應(yīng)該在哪里進(jìn)行優(yōu)化。在標(biāo)準(zhǔn)庫(kù)里居然采用了如此笨拙的設(shè)計(jì),真不敢
想象會(huì)在程序員里引發(fā)什么樣的情緒。
另一個(gè)值得注意的是Hashtable(散列表),它是另一個(gè)重要的標(biāo)準(zhǔn)類。該類沒(méi)有采用任何final 方法。正
如我們?cè)诒緯?shū)其他地方提到的那樣,顯然一些類的設(shè)計(jì)人員與其他設(shè)計(jì)人員有著全然不同的素質(zhì)(注意比較
Hashtable 極短的方法名與Vecor 的方法名)。對(duì)類庫(kù)的用戶來(lái)說(shuō),這顯然是不應(yīng)該如此輕易就能看出的。
一個(gè)產(chǎn)品的設(shè)計(jì)變得不一致后,會(huì)加大用戶的工作量。這也從另一個(gè)側(cè)面強(qiáng)調(diào)了代碼設(shè)計(jì)與檢查時(shí)需要很強(qiáng)
的責(zé)任心 本文出自:億恩科技【mszdt.com】
服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]
|