為什么“類繼承”是有害的耸三?

很多Java程序員喜歡將“面向?qū)ο笕筇匦浴狈顬楣玺叶福貏e是“繼承”,在他們眼中仪壮,“繼承”是“面向?qū)ο蟆弊钪匾奶匦院┑撸聦嵣蠌V義的“面向?qū)ο蟆辈]有限定必需“繼承”,甚至“面向?qū)ο蟆边@個概念在業(yè)界上也還沒達成統(tǒng)一积锅,比如像Go和Rust這類不支持“繼承”的編程語言爽彤,也有很多人認為它們是“面向?qū)ο蟆钡恼Z言。

今天我就想給很多Java程序員們潑一盤冷水:“類繼承”是有害的乏沸。

為什么我明確是“類繼承”呢淫茵?因為“接口繼承”并不在此列,所以需要特別指出蹬跃。

我的觀點是:在所有的大型Java項目中,凡是最難以維護铆铆、難以修改蝶缀、難以閱讀、牽一發(fā)而動全身的代碼薄货,必然是那些使用了“類繼承”的代碼翁都。

這是因為“類繼承”違反了一個設(shè)計原則:最小職責(zé)原則。

對于父類來說谅猾,它即是實現(xiàn)又是抽象柄慰。實現(xiàn)是對于父類本身而言,它可以被實例化成對象税娜;而抽象則是對于子類來說坐搔,它是子類的抽象。這兩個特性分開來都說好特性敬矩,組合在一起就變成了難吃的五仁月餅概行。

對于實現(xiàn)而言,父類就不可能做得太小弧岳,因為它是有功能性的凳忙,即使它把單一的功能拆散成多個類再組合起來,這樣對于子類來說禽炬,也是繼承了父類的全部步淹,而這恰恰造成了很大的耦合度——要是在將來重構(gòu)發(fā)現(xiàn)子類不需要某個方法,也無法去掉健民,因為一旦去掉憾朴,就不滿足父類了。你可能覺得可以在方法體里拋個異常即可,但是對于調(diào)用方來說胎撤,一旦不知道這一點晓殊,就會出現(xiàn)BUG,一旦系統(tǒng)中這種設(shè)計越來越多伤提,整個系統(tǒng)就會混亂不堪巫俺,就像縫縫補補的破褲子一樣。

而對于抽象來說肿男,父類承擔(dān)起了接口的責(zé)任介汹,一個巨大的接口,這也是Java程序員津津樂道的“多態(tài)”舶沛。但是可怕的是嘹承,父類的多態(tài)類,有可能是它繼承樹下面的所有子類中的其中一個如庭,而這個子類叹卷,又可能是其他子類的父類,你需要了解整個繼承鏈路上的所有子類坪它;而對于接口而言骤竹,實現(xiàn)類就是一張鋪平的網(wǎng),你要了解的這里的其中一個即可往毡。

經(jīng)驗豐富的Java程序員有一種說法:“類繼承不能夠超過三層蒙揣,否則就會造成混亂”。這是根據(jù)經(jīng)驗而得出的結(jié)論开瞭,而對于“接口繼承”來說懒震,卻沒有這種說法,一方面是接口很少情況會需要這么多層的繼承嗤详,另一方面是即使超過100層的接口繼承个扰,也不會造成混亂。這是為什么断楷?

因為“類繼承”的混亂是指數(shù)級別的增長锨匆,而“接口繼承”則是線性增長。對于混亂程度冬筒,物理學(xué)上把這種程度定義成熵恐锣,熵的符號是S,假設(shè)繼承層數(shù)是N舞痰,那么土榴,“類繼承”的熵就是O^N,而“接口繼承”則是N*S响牛。

在多層繼承里玷禽,方法的覆蓋會非澈斩危混亂,你不知道方法到底在哪里被覆蓋了矢赁,繼承鏈路上所有子類都有可能是罪魁禍首糯笙。而對于接口來說,即使是接口中的方法是默認方法撩银,也沒關(guān)系给涕,因為只有實現(xiàn)類最終會調(diào)用到方法,更重要的是额获,接口不會被實例化够庙,因此它可以包含最少的方法,就是所謂的單一職責(zé)原則抄邀,而讓實現(xiàn)類實現(xiàn)多個接口耘眨。這樣接口就沒有必要去繼承了。

隨著組合由于繼承的觀念深入人心境肾,很多主流的框架和組件都放棄了繼承剔难,比如Spring,你基本上不需要用到繼承奥喻,除非你自作主張钥飞。

在Java8之前,“類繼承”尚且有他存在的意義衫嵌,那就是代碼復(fù)用;而在Java8之后彻秆,由于接口有了默認方法這一特性楔绞,“類繼承”就變成了徹頭徹尾的垃圾——抱歉我用“垃圾”兩字來形容它,因為我真的不想看到那些使用了繼承還沾沾自喜的代碼了唇兑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酒朵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扎附,更是在濱河造成了極大的恐慌蔫耽,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件留夜,死亡現(xiàn)場離奇詭異匙铡,居然都是意外死亡,警方通過查閱死者的電腦和手機碍粥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門鳖眼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嚼摩,你說我怎么就攤上這事钦讳】笫荩” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵愿卒,是天一觀的道長缚去。 經(jīng)常有香客問我,道長琼开,這世上最難降的妖魔是什么易结? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮稠通,結(jié)果婚禮上衬衬,老公的妹妹穿的比我還像新娘。我一直安慰自己改橘,他們只是感情好滋尉,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著飞主,像睡著了一般狮惜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碌识,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天碾篡,我揣著相機與錄音,去河邊找鬼筏餐。 笑死开泽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的魁瞪。 我是一名探鬼主播穆律,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼导俘!你這毒婦竟也來了峦耘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤旅薄,失蹤者是張志新(化名)和其女友劉穎辅髓,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體少梁,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡洛口,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了猎莲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绍弟。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖著洼,靈堂內(nèi)的尸體忽然破棺而出樟遣,到底是詐尸還是另有隱情而叼,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布豹悬,位于F島的核電站葵陵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瞻佛。R本人自食惡果不足惜脱篙,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伤柄。 院中可真熱鬧绊困,春花似錦、人聲如沸适刀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笔喉。三九已至取视,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間常挚,已是汗流浹背作谭。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奄毡,地道東北人折欠。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像吼过,于是被迫代替她去往敵國和親怨酝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容