關(guān)鍵字final
final關(guān)鍵字在大多數(shù)的編程語(yǔ)言中都存在,表示不允許對(duì)其修飾的內(nèi)容進(jìn)行繼承或者重新操作渊啰。
Swift中贯卦,final關(guān)鍵字可以在class、func和var前修飾甘桑。
通常大家都認(rèn)為使用final可以更好地對(duì)代碼進(jìn)行版本控制拍皮,發(fā)揮更>佳的性能,同時(shí)使代碼更安全跑杭。
什么情況下使用final
- 想通過(guò)使用final提升程序性能 - 效果有限
通常認(rèn)為final能改成性能铆帽,因?yàn)榫幾g器能從final中獲取額外的信息,因此可以對(duì)類或者方法調(diào)用進(jìn)行額外的優(yōu)化處理德谅。但這中優(yōu)化對(duì)程序性能的提升極其有限爹橱。但是這個(gè)優(yōu)勢(shì)在實(shí)際表現(xiàn)中可能帶來(lái)的好處其實(shí)就算與 Objective-C 的動(dòng)態(tài)派發(fā)相比也十分有限,因此在項(xiàng)目還有其他方面可以優(yōu)化 (一般來(lái)說(shuō)會(huì)是算法或者圖形相關(guān)的內(nèi)容導(dǎo)致性能瓶頸) 的情況下,并不建議使用將類或者方法轉(zhuǎn)為 final 的方式來(lái)追求性能的提升窄做。所以如果抱著提升性能的想法愧驱,就算把所有不需要繼承的方法、類都加上final關(guān)鍵字浸策,也沒(méi)多大作用冯键。
- final正確的使用場(chǎng)景 - 權(quán)限控制
也就是說(shuō)這個(gè)類或方法不希望被繼承和重寫,具體情況如下:
類或者方法的功能確實(shí)已經(jīng)完備了
這種通常是一些輔助性質(zhì)的工具類或者方法庸汗,特別那種只包含類方法而沒(méi)有實(shí)例方法的類惫确。比如MD5加密類這種,算法都十分固定,我們基本不會(huì)再繼承和重寫改化。避免子類繼承和修改造成危險(xiǎn)
有些方法如果被子類繼承重寫會(huì)造成破壞性的后果掩蛤,導(dǎo)致無(wú)法正常工作,則需要將其標(biāo)為final加以保護(hù)陈肛。為了讓父類中某些代碼一定會(huì)執(zhí)行
父類的方法如果想要其中一些關(guān)鍵代碼在繼承重寫后仍必須執(zhí)行(比如狀態(tài)配置揍鸟、認(rèn)證等)。我們可以把父類的方法定義成final句旱,同時(shí)將內(nèi)部可以繼承的部分剝離出來(lái)阳藻,供子類繼承重寫。下面通過(guò)一段代碼演示:
class Parent {
final func method1() {
//權(quán)限驗(yàn)證(必須執(zhí)行)
//.....
method2()
//下面是日志記錄(必須執(zhí)行)
//..........
}
func method2(){
//父類的實(shí)現(xiàn)
//......
}
}
class Child : Parent {
//只能重寫父類的method2方法谈撒,不能重寫method1方法
override func method2() {
//子類的實(shí)現(xiàn)
//......
}
}
這樣腥泥,無(wú)論如何我們?nèi)绾问褂?method,都可以保證需要的代碼一定被運(yùn)行過(guò)啃匿,而同時(shí)又給了子類繼承和重寫自定義具體實(shí)現(xiàn)的機(jī)會(huì)蛔外。