91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

為什么阿里巴巴建議開發者謹慎使用繼承?

發布時間:2020-07-26 20:12:33 來源:網絡 閱讀:463 作者:Hollis在51CTO 欄目:編程語言

很多人都知道,博主最近在更新一個專題——《解讀阿里巴巴Java開發手冊》,本文是該專題中的另外一篇。

從學習Java的第一天起,我們就知道Java是一種面向對象語言,而學習Java的第二天,我們就知道了面向對象的三大基本特性是:封裝、繼承、多態。

所以,對于很多開發者來說,繼承肯定都是不陌生的。但是,繼承一定適合所有的場景嗎?毫無忌諱的使用繼承來做代碼擴展真的好嗎?

為什么《阿里巴巴Java開發手冊》中有一條規定:謹慎使用繼承的方式進行擴展,優先使用組合的方式實現。

為什么阿里巴巴建議開發者謹慎使用繼承??

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

面向對象的復用技術

每個人在剛剛學習繼承的時候都會或多或少的有這樣一個印象:繼承可以幫助我實現類的復用。所以,很多開發人員在需要復用一些代碼的時候會很自然的使用類的繼承的方式,因為書上就是這么寫的(老師就是這么教的)。但是,其實這樣做是不對的。長期大量的使用繼承會給代碼帶來很高的維護成本。

前面提到復用,這里就簡單介紹一下面向對象的復用技術。

復用性是面向對象技術帶來的很棒的潛在好處之一。如果運用的好的話可以幫助我們節省很多開發時間,提升開發效率。但是,如果被濫用那么就可能產生很多難以維護的代碼。

作為一門面向對象開發的語言,代碼復用是Java引人注意的功能之一。Java代碼的復用有繼承,組合以及代理三種具體的表現形式。

<!--wechatfans start-->

繼承

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

為什么阿里巴巴建議開發者謹慎使用繼承??

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

組合

組合(Composition)體現的是整體與部分、擁有的關系。

為什么阿里巴巴建議開發者謹慎使用繼承??

組合是一種has-a的關系。如汽車有一個發動機,學校有一個老師等。

組合與繼承的區別

首先,從類的關系確定時間點上,組合和繼承是有區別的:

繼承,在寫代碼的時候就要指名具體繼承哪個類,所以,在編譯期就確定了關系。并且從基類繼承來的實現是無法在運行期動態改變的,因此降低了應用的靈活性。

組合,在寫代碼的時候可以采用面向接口編程。所以,類的組合關系一般在運行期確定。

另外,代碼復用方式上也有一定區別:

繼承結構中,父類的內部細節對于子類是可見的。所以我們通常也可以說通過繼承的代碼復用是一種白盒式代碼復用

如果基類的實現發生改變,那么派生類的實現也將隨之改變。這樣就導致了子類行為的不可預知性。

組合是通過對現有的對象進行拼裝(組合)產生新的、更復雜的功能。因為在對象之間,各自的內部細節是不可見的,所以我們也說這種方式的代碼復用是黑盒式代碼復用

因為組合中一般都定義一個類型,所以在編譯期根本不知道具體會調用哪個實現類的方法。

最后,Java中不支持多繼承,而組合是沒有限制的。就像一個人只能有一個父親,但是他可以有很很多輛車。

優缺點對比

組 合 關 系 繼 承 關 系
優點:不破壞封裝,整體類與局部類之間松耦合,彼此相對獨立 缺點:破壞封裝,子類與父類之間緊密耦合,子類依賴于父類的實現,子類缺乏獨立性
優點:具有較好的可擴展性 缺點:支持擴展,但是往往以增加系統結構的復雜度為代價
優點:支持動態組合。在運行時,整體對象可以選擇不同類型的局部對象 缺點:不支持動態繼承。在運行時,子類無法選擇不同的父類
優點:整體類可以對局部類進行包裝,封裝局部類的接口,提供新的接口 缺點:子類不能改變父類的接口
缺點:整體類不能自動獲得和局部類同樣的接口 優點:子類能自動繼承父類的接口
缺點:創建整體類的對象時,需要創建所有局部類的對象 優點:創建子類的對象時,無須創建父類的對象

為什么組合優于繼承

相信很多人都知道面向對象中有一個比較重要的原則『多用組合、少用繼承』或者說『組合優于繼承』。從前面的介紹已經優缺點對比中也可以看出,組合確實比繼承更加靈活,也更有助于代碼維護。

所以,建議在同樣可行的情況下,優先使用組合而不是繼承。因為組合更安全,更簡單,更靈活,更高效。

注意,并不是說繼承就一點用都沒有了,前面說的是【在同樣可行的情況下】。有一些場景還是需要使用繼承的,或者是更適合使用繼承。

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

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

只有當子類真正是超類的子類型時,才適合用繼承。換句話說,對于兩個類A和B,只有當兩者之間確實存在is-a關系的時候,類B才應該繼續類A。《Effective Java》

<!--wechatfans end-->

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

通化县| 霍林郭勒市| 嘉义市| 徐水县| 海林市| 遵化市| 南和县| 竹山县| 密山市| 宁明县| 萝北县| 九龙坡区| 枣庄市| 资讯| 庐江县| 斗六市| 湖州市| 洱源县| 陵水| 林甸县| 陆丰市| 岚皋县| 长兴县| 连城县| 界首市| 抚州市| 全南县| 上饶县| 永登县| 太原市| 泸溪县| 淮南市| 南涧| 汨罗市| 望江县| 吉林市| 泾阳县| 陵水| 明星| 嘉禾县| 凌海市|