關(guān)鍵詞final在Java中有多重用途,既可被用于instance變量、static變量
也可用于classes或methods,表示不允許客戶覆寫它們。
當(dāng)一個(gè)方法被聲明成final,在兩個(gè)領(lǐng)域中顯得有位重要:
- class設(shè)計(jì)
- 運(yùn)行期性能
在程序設(shè)計(jì)里,有時(shí)我們不希望我們的方法被重寫或覆蓋,final關(guān)鍵字保證了這一點(diǎn)。
final關(guān)鍵字是怎么影響性能的呢?
當(dāng)我們的方法被聲明成static,final和private, 此方法將成為Inlining(內(nèi)聯(lián)函數(shù))的候選者。此類方法可以在編譯期被靜態(tài)決議(staticallyresolved),而不需要?jiǎng)討B(tài)決議(dynamicResolution)。以方法本體(methodbody)替換方法調(diào)用(methodcall)會(huì)使代碼執(zhí)行速度更快。
將方法聲明為static、final和private會(huì)帶來(lái)一些缺點(diǎn):這樣的方法無(wú)法通過(guò)Subclassing(子類化)進(jìn)行擴(kuò)展。這就束縛了derived class通過(guò)class函數(shù)做事情的機(jī)會(huì)。inlined方法只有在被多次調(diào)用的情況下,才會(huì)獲得令人側(cè)目的性能提升。這是因?yàn)楫?dāng)一個(gè)方法被inline后,就不再需要負(fù)擔(dān)方法調(diào)用的額外開(kāi)銷。因此,方法被調(diào)用愈多次,節(jié)省就愈多。
不過(guò)inlining也可能使你的代碼體積變大。如果這個(gè)方法有許多調(diào)用點(diǎn),.class文件的體積便會(huì)膨脹,這是因?yàn)樵局恍璐鎯?chǔ)一份的函數(shù)碼,由于inline而在所有調(diào)用點(diǎn)被復(fù)制了一份。
Kyle Wang