日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
為什么阿里巴巴建議開發(fā)者謹(jǐn)慎使用繼承?

 [[275598]]

從學(xué)習(xí)Java的第一天起,我們就知道Java是一種面向?qū)ο笳Z言,而學(xué)習(xí)Java的第二天,我們就知道了面向?qū)ο蟮娜蠡咎匦允牵悍庋b、繼承、多態(tài)。所以,對于很多開發(fā)者來說,繼承肯定都是不陌生的。但是,繼承一定適合所有的場景嗎?毫無忌諱的使用繼承來做代碼擴(kuò)展真的好嗎?為什么《阿里巴巴Java開發(fā)手冊》中有一條規(guī)定:謹(jǐn)慎使用繼承的方式進(jìn)行擴(kuò)展,優(yōu)先使用組合的方式實現(xiàn)。

本文就來針對這些問題,簡單分析一下。

1.面向?qū)ο蟮膹?fù)用技術(shù)

每個人在剛剛學(xué)習(xí)繼承的時候都會或多或少的有這樣一個印象:繼承可以幫助我實現(xiàn)類的復(fù)用。所以,很多開發(fā)人員在需要復(fù)用一些代碼的時候會很自然的使用類的繼承的方式,因為書上就是這么寫的(老師就是這么教的)。但是,其實這樣做是不對的。長期大量的使用繼承會給代碼帶來很高的維護(hù)成本。前面提到復(fù)用,這里就簡單介紹一下面向?qū)ο蟮膹?fù)用技術(shù)。復(fù)用性是面向?qū)ο蠹夹g(shù)帶來的很棒的潛在好處之一。如果運(yùn)用的好的話可以幫助我們節(jié)省很多開發(fā)時間,提升開發(fā)效率。但是,如果被濫用那么就可能產(chǎn)生很多難以維護(hù)的代碼。作為一門面向?qū)ο箝_發(fā)的語言,代碼復(fù)用是Java引人注意的功能之一。Java代碼的復(fù)用有繼承,組合以及代理三種具體的表現(xiàn)形式。

2.繼承

繼承(Inheritance)是一種聯(lián)結(jié)類與類的層次模型。指的是一個類(稱為子類、子接口)繼承另外的一個類(稱為父類、父接口)的功能,并可以增加它自己的新功能的能力,繼承是類與類或者接口與接口之間最常見的關(guān)系。

 

繼承是一種is-a關(guān)系。如蘋果是水果,狗是動物,哈士奇是狗。

3.組合

組合(Composition)體現(xiàn)的是整體與部分、擁有的關(guān)系。

 

組合是一種has-a的關(guān)系。如汽車有一個發(fā)動機(jī),學(xué)校有一個老師等。

4.組合與繼承的區(qū)別

首先,從類的關(guān)系確定時間點上,組合和繼承是有區(qū)別的:繼承,在寫代碼的時候就要指名具體繼承哪個類,所以,類的繼承關(guān)系是在編譯期就確定的。并且從基類繼承來的實現(xiàn)是無法在運(yùn)行期動態(tài)改變的,因此降低了應(yīng)用的靈活性。組合,在寫代碼的時候可以采用面向接口編程。所以,類的組合關(guān)系一般在運(yùn)行期確定。另外,代碼復(fù)用方式上也有一定區(qū)別:繼承結(jié)構(gòu)中,父類的內(nèi)部細(xì)節(jié)對于子類是可見的。所以我們通常也可以說通過繼承的代碼復(fù)用是一種白盒式代碼復(fù)用。如果基類的實現(xiàn)發(fā)生改變,那么派生類的實現(xiàn)也將隨之改變。這樣就導(dǎo)致了子類行為的不可預(yù)知性。組合是通過對現(xiàn)有的對象進(jìn)行拼裝(組合)產(chǎn)生新的、更復(fù)雜的功能。因為在對象之間,各自的內(nèi)部細(xì)節(jié)是不可見的,所以我們也說通過組合的代碼復(fù)用是黑盒式代碼復(fù)用。因為組合中一般都定義一個類型,所以在編譯期根本不知道具體會調(diào)用哪個實現(xiàn)類的方法。最后,Java中不支持多繼承,而組合是沒有限制的。就像一個人只能有一個父親,但是他可以有很很多輛車。

5.優(yōu)缺點對比

6.為什么組合優(yōu)于繼承

相信很多人都知道面向?qū)ο笾杏幸粋€比較重要的原則『多用組合、少用繼承』或者說『組合優(yōu)于繼承』。從前面的介紹已經(jīng)優(yōu)缺點對比中也可以看出,組合比繼承更加靈活,也更有助于代碼維護(hù)。其具有不破壞封裝性、具有更好的可擴(kuò)展性、支持動態(tài)組合、整體類可以改變局部類的行為等優(yōu)點。所以,建議在同樣可行的情況下,優(yōu)先使用組合而不是繼承。因為組合更安全,更簡單,更靈活,更高效。注意,并不是說繼承就一點用都沒有了,前面說的是【在同樣可行的情況下】。有一些場景還是需要使用繼承的,或者是更適合使用繼承。

另外,除了《阿里巴巴Java開發(fā)手冊》,在很多其他資料中也有關(guān)于組合和繼承的介紹和使用約束:

繼承要慎用,其使用場合僅限于你確信使用該技術(shù)有效的情況。一個判斷方法是,問一問自己是否需要從新類向基類進(jìn)行向上轉(zhuǎn)型。如果是必須的,則繼承是必要的。反之則應(yīng)該好好考慮是否需要繼承。《Java編程思想》

只有當(dāng)子類真正是超類的子類型時,才適合用繼承。換句話說,對于兩個類A和B,只有當(dāng)兩者之間確實存在is-a關(guān)系的時候,類B才應(yīng)該繼續(xù)類A?!禘ffective Java》


當(dāng)前標(biāo)題:為什么阿里巴巴建議開發(fā)者謹(jǐn)慎使用繼承?
網(wǎng)站鏈接:http://m.5511xx.com/article/djjghjj.html