亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

如何在Java中消除實現繼承和面向接口編程

2019-11-17 04:59:18
字體:
來源:轉載
供稿:網友

在匆忙之際理清消除實現繼承和面向接口編程這樣兩個大問題可不是一件容易的事情,尤其考慮到自身的認識水平。坦白的說,這又是一篇“炒冷飯”的文章,但這“冷飯”又確實不好炒。因此,在閱讀了這篇文章之后,你可要批判地接受(拒絕)我的觀點,盡管我的觀點也是來自于別人的觀點。

繼承是面向對象中很重要的概念。如果考慮到java語言特性,繼承分為兩種:接口繼承和實現繼承。這只是技術層面的問題,即便C++中不存在接口的概念,但它的虛基類實際上也相當于接口。對于OO的初學者來說,他們很希望自己的程序中出現大量的繼承,因為這樣看起來很OO。但濫用繼承會帶來很多問題,盡管有時候我們又不得不使用繼承解決問題。

相比于接口繼承,實現繼承的問題要更多,它會帶來更多的耦合問題。但接口繼承也是有問題的,這是繼承本身的問題。實現繼承的很多問題出于其自身實現上,因此這里重點討論實現繼承的問題。

舉個例子(這個例子實在太老套了)。我要實現一個Stack類,我想當然地選擇Stack類繼承于ArrayList類(你也可以認為我很想OO些或者出于本性的懶惰);現在又有了新的需求,需要實現一個線程安全的Stack,我又定義了一個ConcurrentStack類繼承于Stack并覆蓋了Stack中的部分代碼。

因為Stack繼承于ArrayList,Stack不得不對外暴露出ArrayList所有的public方法,即便其中的某些方法對它可能是不需要的;甚至更糟的是,可能其中的某些方法能改變Stack的狀態,而Stack對這些改變并不知情,這就會造成Stack的邏輯錯誤。

如果我要在ArrayList中添加新的方法,這個方法就有可能在邏輯上破壞它的派生類Stack、 ConcurrentStack。因此在基類(父類)添加方法(修改代碼)時,必須檢查這些修改是否會對派生類產生影響;如果產生影響的話,就不得不對派生類做進一步的修改。如果類的繼承體系不是一個人完成的,或者是修改別人的代碼的情況下,很可能因為繼承產生難以覺察的BUG。

問題還是有的。我們有時會見到這樣的基類,它的一些方法只是拋出異常,這意味著如果派生類支持這個方法就重寫它,否則就如父類一樣拋出異常表明其不支持這個方法的調用。我們也能見到它的一個變種,父類的方法是抽象的,但不是所有的子類都支持這個方法,不支持的方法就以拋出異常的方式表明立場。這種做法是很不友好和很不安全的,它們只能在運行時被“僥幸捕捉”,而很多漏網的異常方法可能會在某一天突然出現,讓人不知所措。

引起上面問題的很重要的原因便是基類和派生類之間的耦合。往往只是對基類做了小小的改動,卻不得不重構它們的所有的派生類,這就是臭名昭著的“脆弱的基類”問題。由于類之間的關系是存在的,因此耦合是不可避免的甚至是必要的。但在做OO設計時,當遇到如基類和派生類之間的強耦合關系,我們就要思量思量,是否一定需要繼承呢?是否會有其他的更優雅的替代方案呢?如果一定要學究的話,你會在很多書中會看到這樣的原則:如果兩個類之間是IS-A關系,那么就使用繼承;如果兩個類之間是Has-A的關系,那么就使用委派。很多時候這條原則是適用的,但IS-A并不能做為使用繼承的絕對理由。有時為了消除耦合帶來的問題,使用委派等方法會更好地封裝實現細節。繼承有時會對外及向下暴露太多的信息,在GOF的設計模式中,有很多模式的目的就是為了消除繼承。

關于何時采用繼承,一個重要的原則是確定方法是否能夠共享。比如DAO ,可以將通用的CRUD 方法定在一個抽象DAO 中,具體的DAO 都派生自這個抽象類。嚴格的說,抽象DAO 和派生的DAO 實現并不具有IS -A 關系,我們只是為了避免重復的方法定義和實現而作出了這一技術上的選擇??梢哉f,使用接口還是抽象類的原則是,如果多個派生類的方法內容沒有共同的地方,就用接口作為抽象;如果 多個派生類 的方法含有共同的地方,就用抽象類作為抽象。當這一原則不適用于接口繼承,如果出現接口繼承,就會相應地有實現繼承(基類更多的是抽象類)。

現在說說面向接口編程。在眾多的敏捷方法中,面向接口編程總是被大師們反復的強調。面向接口編程,實際上是面向抽象編程,將抽象概念和具體實現相隔離。這一原則使得我們擁有了更高層次的抽象模型,在面對不斷變更的需求時,只要抽象模型做的好,修改代碼就要容易的多。但面向接口編程不意味著非得一個接口對應一個類,過多的不必要的接口也可能帶來更多的工作量和維護上的困難。

相比于繼承,OO中多態的概念要更重要。一個接口可以對應多個實現類,對于聲明為接口類型的方法參數、類的字段,它們要比實現類更易于擴展、穩定,這也是多態的優點。假如我以實現類作為方法參數定義了一個方法void doSomething(ArrayList list),但如果領導哪天覺得 ArrayList不如LinkedList更好用,我將不得不將方法重構為void doSomething(LinkedList list),相應地要在所有調用此方法的地方修改參數類型(很遺憾地,我連對象創建也是采用ArrayList list = new ArrayList()方式,這將大大增加我的修改工作量)。如果領導又覺得用list存儲數據不如set好的話,我將再一次重構方法,但這一次我變聰明了,我將方法定義為void doSomething(Set set),創建對象的方式改為Set set = new HashSet()。但這樣仍不夠,如果領導又要求將set改回list怎么辦?所以我應該將方法重構為void doSomething(Collection collection), Collection的抽象程度最高,更易于替換具體的實現類。即便需要List或者Set固有的特性,我也可以做向下類型轉換解決問題,盡管這樣做并不安全。

面向接口編程最重要的價值在于隱藏實現,將抽象的實現細節封裝起來而不對外開放,封裝這對于Java EE 中的分層設計和框架設計尤其重要。但即便在編程時使用了接口,我們也需要將接口和實現對應起來,這就引出如何創建對象的問題。在創建型設計模式中,單例、工廠方法(模板方法)、抽象工廠等模式都是很好的解決辦法?,F在流行的控制反轉(也叫依賴注入)模式是以聲明的方式將抽象與實現連接起來,這既減少了單調的工廠類也更易于單元測試。

做個總結吧。盡管我竭力批駁繼承的不好鼓吹接口的好,但這并不是絕對的。濫用繼承、濫用接口都會帶來問題。做Java EE開發的很多朋友抱怨DAO、Service中一個接口一個類的實現方式,盡管它們似乎看起來已成為業界的最佳實踐之一。也許排除掉接口會使程序更“瘦”一些,但“瘦”并一定就“好”,需要根據項目的具體情況而定。關于繼承和接口的最佳實踐,各位看官還是需要自身的經驗積累和總結了。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
川上优av一区二区线观看| 国产精品亚发布| 国语自产偷拍精品视频偷| 中文字幕亚洲在线| 亚洲性av在线| 日韩二区三区在线| 国产福利视频一区| 亚洲国产婷婷香蕉久久久久久| 欧美性猛交xxxx黑人| 亚洲人成网7777777国产| 日韩精品在线私人| 亚洲淫片在线视频| 亚洲最新视频在线| 一区二区三区国产视频| 国产成人综合精品| 欧美黄色片视频| 欧美大尺度电影在线观看| 九九热精品视频在线播放| 久久久精品视频成人| 亚洲石原莉奈一区二区在线观看| 国产精品国产三级国产aⅴ浪潮| 亚洲欧美国产一区二区三区| 国产精品扒开腿做爽爽爽男男| 91精品综合久久久久久五月天| 丁香五六月婷婷久久激情| 中文字幕亚洲一区二区三区| 久久久久久久亚洲精品| 欧美精品电影免费在线观看| 亚洲电影在线观看| 精品国模在线视频| 97在线观看免费高清| 亚洲精品中文字| 国产精品jvid在线观看蜜臀| 成人国产亚洲精品a区天堂华泰| 日韩欧美在线视频观看| 日韩视频在线免费观看| 国产成人精品久久久| 欧美黄色免费网站| 欧美日韩免费区域视频在线观看| 91高清视频在线免费观看| 综合网日日天干夜夜久久| 国产精品v片在线观看不卡| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲精品av在线播放| 亚洲欧美日本伦理| 亚洲伦理中文字幕| 色吧影院999| 黄色一区二区在线| 亚洲成**性毛茸茸| 成人啪啪免费看| 亚洲自拍在线观看| 国产日韩专区在线| 亚洲乱码国产乱码精品精天堂| 亚洲成人精品视频在线观看| 中文字幕在线观看亚洲| 韩国19禁主播vip福利视频| 国产香蕉一区二区三区在线视频| 亚洲精品国产电影| 欧美中文字幕精品| 亚洲黄在线观看| 亚洲美女精品成人在线视频| 韩国一区二区电影| 日日狠狠久久偷偷四色综合免费| 日韩成人中文电影| 欧美日韩精品在线观看| 色yeye香蕉凹凸一区二区av| 亚洲美女在线观看| 亚洲3p在线观看| 91精品视频一区| 77777亚洲午夜久久多人| 国产丝袜精品视频| 久久久人成影片一区二区三区观看| 美日韩在线视频| 91精品国产91久久久久久| 欧美激情精品久久久久久久变态| 精品香蕉一区二区三区| 久久伊人精品天天| 日韩在线视频导航| 亚洲女人天堂视频| 欧美成人性色生活仑片| 中文字幕日韩av电影| 91av在线网站| 日韩性生活视频| 午夜精品国产精品大乳美女| 亚洲国产日韩欧美在线图片| 亚洲色图17p| 91中文精品字幕在线视频| 久久久久国产精品免费网站| 91夜夜未满十八勿入爽爽影院| 欧美三级欧美成人高清www| 色偷偷综合社区| 国产精品一区二区av影院萌芽| 亚洲欧美日韩中文在线制服| 在线观看亚洲区| 亚洲www永久成人夜色| 91精品国产综合久久香蕉922| 欧美精品生活片| 国模精品系列视频| 国产精品视频导航| 色综合色综合久久综合频道88| 亚洲最大激情中文字幕| 国产97色在线|日韩| 精品亚洲一区二区三区| 91九色精品视频| 亚洲精品白浆高清久久久久久| 欧美精品在线网站| 国产91精品黑色丝袜高跟鞋| 亚洲一区二区中文字幕| 日韩av一区在线观看| www高清在线视频日韩欧美| 久久久久久久999精品视频| 中文字幕亚洲在线| 中文字幕亚洲专区| 91精品国产高清| 欧美大尺度电影在线观看| 在线播放精品一区二区三区| 欧美精品在线网站| 日韩在线视频免费观看高清中文| 亚洲最大福利视频网| 久久国产精品久久久| 北条麻妃在线一区二区| 在线观看日韩av| 亚洲www永久成人夜色| 超薄丝袜一区二区| 精品久久久在线观看| 欧美成人激情视频免费观看| 精品亚洲一区二区三区在线观看| 国产精品久久久久久av福利| 国产mv久久久| 国产精品678| 国产欧美精品一区二区三区-老狼| 色与欲影视天天看综合网| 国外色69视频在线观看| 欧美激情视频一区| 国产在线一区二区三区| 欧美在线观看视频| 中国人与牲禽动交精品| 国产精品免费看久久久香蕉| 尤物yw午夜国产精品视频| 亚洲欧美综合精品久久成人| 91成人在线播放| 国产精品久久网| 中文字幕在线成人| 亚洲成人免费网站| 92福利视频午夜1000合集在线观看| 久久久久久这里只有精品| 欧美国产精品va在线观看| 久久99精品久久久久久噜噜| 国产一区二区三区三区在线观看| 欧美色欧美亚洲高清在线视频| 日韩电影在线观看免费| 久热精品视频在线观看| 九九九久久国产免费| 久久精品亚洲94久久精品| 91精品国产高清| 中文字幕欧美日韩| 亚洲男人天堂久| 神马国产精品影院av| xxxxx成人.com| 国产精品电影一区| 国产精品最新在线观看| 日韩成人av网址| 欧美性生交xxxxxdddd| 久久久av网站|