很多人都知道,博主最近在更新一個(gè)專題——《解讀阿里巴巴Java開發(fā)手冊(cè)》,本文是該專題中的另外一篇。
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),渾江企業(yè)網(wǎng)站建設(shè),渾江品牌網(wǎng)站建設(shè),網(wǎng)站定制,渾江網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,渾江網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。從學(xué)習(xí)Java的第一天起,我們就知道Java是一種面向?qū)ο笳Z言,而學(xué)習(xí)Java的第二天,我們就知道了面向?qū)ο蟮娜蠡咎匦允牵悍庋b、繼承、多態(tài)。
所以,對(duì)于很多開發(fā)者來說,繼承肯定都是不陌生的。但是,繼承一定適合所有的場(chǎng)景嗎?毫無忌諱的使用繼承來做代碼擴(kuò)展真的好嗎?
為什么《阿里巴巴Java開發(fā)手冊(cè)》中有一條規(guī)定:謹(jǐn)慎使用繼承的方式進(jìn)行擴(kuò)展,優(yōu)先使用組合的方式實(shí)現(xiàn)。
?
本文就來針對(duì)這些問題,簡單分析一下。
每個(gè)人在剛剛學(xué)習(xí)繼承的時(shí)候都會(huì)或多或少的有這樣一個(gè)印象:繼承可以幫助我實(shí)現(xiàn)類的復(fù)用。所以,很多開發(fā)人員在需要復(fù)用一些代碼的時(shí)候會(huì)很自然的使用類的繼承的方式,因?yàn)闀暇褪沁@么寫的(老師就是這么教的)。但是,其實(shí)這樣做是不對(duì)的。長期大量的使用繼承會(huì)給代碼帶來很高的維護(hù)成本。
前面提到復(fù)用,這里就簡單介紹一下面向?qū)ο蟮膹?fù)用技術(shù)。
復(fù)用性是面向?qū)ο蠹夹g(shù)帶來的很棒的潛在好處之一。如果運(yùn)用的好的話可以幫助我們節(jié)省很多開發(fā)時(shí)間,提升開發(fā)效率。但是,如果被濫用那么就可能產(chǎn)生很多難以維護(hù)的代碼。
作為一門面向?qū)ο箝_發(fā)的語言,代碼復(fù)用是Java引人注意的功能之一。Java代碼的復(fù)用有繼承,組合以及代理三種具體的表現(xiàn)形式。
<!--wechatfans start-->
繼承(Inheritance)是一種聯(lián)結(jié)類與類的層次模型。指的是一個(gè)類(稱為子類、子接口)繼承另外的一個(gè)類(稱為父類、父接口)的功能,并可以增加它自己的新功能的能力,繼承是類與類或者接口與接口之間最常見的關(guān)系。
?
繼承是一種is-a關(guān)系。如蘋果是水果,狗是動(dòng)物,哈士奇是狗。
組合(Composition)體現(xiàn)的是整體與部分、擁有的關(guān)系。
?
組合是一種has-a的關(guān)系。如汽車有一個(gè)發(fā)動(dòng)機(jī),學(xué)校有一個(gè)老師等。
首先,從類的關(guān)系確定時(shí)間點(diǎn)上,組合和繼承是有區(qū)別的:
繼承,在寫代碼的時(shí)候就要指名具體繼承哪個(gè)類,所以,在編譯期就確定了關(guān)系。并且從基類繼承來的實(shí)現(xiàn)是無法在運(yùn)行期動(dòng)態(tài)改變的,因此降低了應(yīng)用的靈活性。
組合,在寫代碼的時(shí)候可以采用面向接口編程。所以,類的組合關(guān)系一般在運(yùn)行期確定。
另外,代碼復(fù)用方式上也有一定區(qū)別:
繼承結(jié)構(gòu)中,父類的內(nèi)部細(xì)節(jié)對(duì)于子類是可見的。所以我們通常也可以說通過繼承的代碼復(fù)用是一種白盒式代碼復(fù)用。
如果基類的實(shí)現(xiàn)發(fā)生改變,那么派生類的實(shí)現(xiàn)也將隨之改變。這樣就導(dǎo)致了子類行為的不可預(yù)知性。
組合是通過對(duì)現(xiàn)有的對(duì)象進(jìn)行拼裝(組合)產(chǎn)生新的、更復(fù)雜的功能。因?yàn)樵趯?duì)象之間,各自的內(nèi)部細(xì)節(jié)是不可見的,所以我們也說這種方式的代碼復(fù)用是黑盒式代碼復(fù)用。
因?yàn)榻M合中一般都定義一個(gè)類型,所以在編譯期根本不知道具體會(huì)調(diào)用哪個(gè)實(shí)現(xiàn)類的方法。
最后,Java中不支持多繼承,而組合是沒有限制的。就像一個(gè)人只能有一個(gè)父親,但是他可以有很很多輛車。
組 合 關(guān) 系 | 繼 承 關(guān) 系 |
---|---|
優(yōu)點(diǎn):不破壞封裝,整體類與局部類之間松耦合,彼此相對(duì)獨(dú)立 | 缺點(diǎn):破壞封裝,子類與父類之間緊密耦合,子類依賴于父類的實(shí)現(xiàn),子類缺乏獨(dú)立性 |
優(yōu)點(diǎn):具有較好的可擴(kuò)展性 | 缺點(diǎn):支持?jǐn)U展,但是往往以增加系統(tǒng)結(jié)構(gòu)的復(fù)雜度為代價(jià) |
優(yōu)點(diǎn):支持動(dòng)態(tài)組合。在運(yùn)行時(shí),整體對(duì)象可以選擇不同類型的局部對(duì)象 | 缺點(diǎn):不支持動(dòng)態(tài)繼承。在運(yùn)行時(shí),子類無法選擇不同的父類 |
優(yōu)點(diǎn):整體類可以對(duì)局部類進(jìn)行包裝,封裝局部類的接口,提供新的接口 | 缺點(diǎn):子類不能改變父類的接口 |
缺點(diǎn):整體類不能自動(dòng)獲得和局部類同樣的接口 | 優(yōu)點(diǎn):子類能自動(dòng)繼承父類的接口 |
缺點(diǎn):創(chuàng)建整體類的對(duì)象時(shí),需要?jiǎng)?chuàng)建所有局部類的對(duì)象 | 優(yōu)點(diǎn):創(chuàng)建子類的對(duì)象時(shí),無須創(chuàng)建父類的對(duì)象 |
相信很多人都知道面向?qū)ο笾杏幸粋€(gè)比較重要的原則『多用組合、少用繼承』或者說『組合優(yōu)于繼承』。從前面的介紹已經(jīng)優(yōu)缺點(diǎn)對(duì)比中也可以看出,組合確實(shí)比繼承更加靈活,也更有助于代碼維護(hù)。
所以,建議在同樣可行的情況下,優(yōu)先使用組合而不是繼承。因?yàn)榻M合更安全,更簡單,更靈活,更高效。
注意,并不是說繼承就一點(diǎn)用都沒有了,前面說的是【在同樣可行的情況下】。有一些場(chǎng)景還是需要使用繼承的,或者是更適合使用繼承。
另外,除了《阿里巴巴Java開發(fā)手冊(cè)》,在很多其他資料中也有關(guān)于組合和繼承的介紹和使用約束:
繼承要慎用,其使用場(chǎng)合僅限于你確信使用該技術(shù)有效的情況。一個(gè)判斷方法是,問一問自己是否需要從新類向基類進(jìn)行向上轉(zhuǎn)型。如果是必須的,則繼承是必要的。反之則應(yīng)該好好考慮是否需要繼承?!禞ava編程思想》
只有當(dāng)子類真正是超類的子類型時(shí),才適合用繼承。換句話說,對(duì)于兩個(gè)類A和B,只有當(dāng)兩者之間確實(shí)存在is-a關(guān)系的時(shí)候,類B才應(yīng)該繼續(xù)類A?!禘ffective Java》
<!--wechatfans end-->
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。
網(wǎng)站名稱:為什么阿里巴巴建議開發(fā)者謹(jǐn)慎使用繼承?-創(chuàng)新互聯(lián)
網(wǎng)頁網(wǎng)址:http://chinadenli.net/article26/cepcjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)站內(nèi)鏈、品牌網(wǎng)站制作、手機(jī)網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容