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

首頁 > 編程 > Java > 正文

為什么Java中繼承多數(shù)是有害的

2020-03-24 18:52:34
字體:
供稿:網(wǎng)友
大多數(shù)好的設(shè)計(jì)者象躲避瘟疫一樣來避免使用實(shí)現(xiàn)繼承(extends 關(guān)系)。實(shí)際上80%的代碼應(yīng)該完全用interfaces寫,而不是通過extends?!?a href='http://www.49028c.com/tag/javajiexi_11110_1.html' target='_blank'>Java設(shè)計(jì)模式”一書詳細(xì)闡述了怎樣用接口繼承代替實(shí)現(xiàn)繼承。這篇文章描述設(shè)計(jì)者為什么會(huì)這么作。

Extends是有害的;也許對(duì)于Charles Manson這個(gè)級(jí)別的不是,但是足夠糟糕的它應(yīng)該在任何可能的時(shí)候被避開?!癑AVA設(shè)計(jì)模式”一書花了很大的部分討論用interface繼承代替實(shí)現(xiàn)繼承。

好的設(shè)計(jì)者在他的代碼中,大部分用interface,而不是具體的基類。本文討論為什么設(shè)計(jì)者會(huì)這樣選擇,并且也介紹一些基于interface的編程基礎(chǔ)。

接口(Interface)和類(Class)?

一次,我參加一個(gè)Java用戶組的會(huì)議。在會(huì)議中,Jams Gosling(Java之父)做發(fā)起人講話。在那令人難忘的Q&A部分中,有人問他:“如果你重新構(gòu)造Java,你想改變什么?”?!拔蚁霋仐?a href='http://www.49028c.com/tag/class_1248_1.html' target='_blank'>classes”他回答。在笑聲平息后,它解釋說,真正的問題不是由于class本身,而是實(shí)現(xiàn)繼承(extends) 關(guān)系。接口繼承(implements關(guān)系)是更好的。你應(yīng)該盡可能的避免實(shí)現(xiàn)繼承。

失去了靈活性

為什么你應(yīng)該避免實(shí)現(xiàn)繼承呢?第一個(gè)問題是明確的使用具體類名將你固定到特定的實(shí)現(xiàn),給底層的改變增加了不必要的困難。

在當(dāng)前的敏捷編程方法中,核心是并行的設(shè)計(jì)和開發(fā)的概念。在你詳細(xì)設(shè)計(jì)程序前,你開始編程。這個(gè)技術(shù)不同于傳統(tǒng)方法的形式----傳統(tǒng)的方式是設(shè)計(jì)應(yīng)該在編碼開始前完成----但是許多成功的項(xiàng)目已經(jīng)證明你能夠更快速的開發(fā)高質(zhì)量代碼,相對(duì)于傳統(tǒng)的按部就班的方法。但是在并行開發(fā)的核心是主張靈活性。你不得不以某一種方式寫你的代碼以至于最新發(fā)現(xiàn)的需求能夠盡可能沒有痛苦的合并到已有的代碼中。

勝于實(shí)現(xiàn)你也許需要的特征,你只需實(shí)現(xiàn)你明確需要的特征,而且適度的對(duì)變化的包容。如果你沒有這種靈活,并行的開發(fā),那簡直不可能。

對(duì)于Inteface的編程是靈活結(jié)構(gòu)的核心。為了說明為什么,讓我們看一下當(dāng)使用它們的時(shí)候,會(huì)發(fā)生什么??紤]下面的代碼:

f()
{
LinkedList list = new LinkedList();
//...
g( list );
}

g( LinkedList list )
{
list.add( ... );
g2( list )
}

假設(shè)一個(gè)對(duì)于快速查詢的需求被提出,以至于這個(gè)LinkedList不能夠解決。你需要用HashSet來代替它。在已有代碼中,變化不能夠局部化,因?yàn)槟悴粌H僅需要修改f()也需要修改g()(它帶有LinkedList參數(shù)),并且還有g(shù)()把列表傳遞給的任何代碼。象下面這樣重寫代碼:

f()
{
Collection list = new LinkedList();
//...
g( list );
}

g( Collection list )
{
list.add( ... );
g2( list )
}

這樣修改Linked list成hash,可能只是簡單的用new HashSet()代替new LinkedList()。就這樣。沒有其他的需要修改的地方。

作為另一個(gè)例子,比較下面兩段代碼:

f()
{
Collection c = new HashSet();
//...
g( c );
}

g( Collection c )
{
for( Iterator i = c.iterator(); i.hasNext() )
do_something_with( i.next() );
}



f2()
{
Collection c = new HashSet();
//...
g2( c.iterator() );
}

g2( Iterator i )
{
while( i.hasNext() )
do_something_with( i.next() );
}


g2()方法現(xiàn)在能夠遍歷Collection的派生,就像你能夠從Map中得到的鍵值對(duì)。事實(shí)上,你能夠?qū)慽terator,它產(chǎn)生數(shù)據(jù),代替遍歷一個(gè)Collection。你能夠?qū)慽terator,它從測試的框架或者文件中得到信息。這會(huì)有巨大的靈活性。

耦合

對(duì)于實(shí)現(xiàn)繼承,一個(gè)更加關(guān)鍵的問題是耦合---令人煩躁的依賴,就是那種程序的一部分對(duì)于另一部分的依賴。全局變量提供經(jīng)典的例子,證明為什么強(qiáng)耦合會(huì)引起麻煩。例如,如果你改變?nèi)肿兞康念愋?,那么所有用到這個(gè)變量的函數(shù)也許都被影響,所以所有這些代碼都要被檢查,變更和重新測試。而且,所有用到這個(gè)變量的函數(shù)通過這個(gè)變量相互耦合。也就是,如果一個(gè)變量值在難以使用的時(shí)候被改變,一個(gè)函數(shù)也許就不正確的影響了另一個(gè)函數(shù)的行為。這個(gè)問題顯著的隱藏于多線程的程序。

作為一個(gè)設(shè)計(jì)者,你應(yīng)該努力最小化耦合關(guān)系。你不能一并消除耦合,因?yàn)閺囊粋€(gè)類的對(duì)象到另一個(gè)類的對(duì)象的方法調(diào)用是一個(gè)松耦合的形式。你不可能有一個(gè)程序,它沒有任何的耦合。然而,你能夠通過遵守OO規(guī)則,最小化一定的耦合(最重要的是,一個(gè)對(duì)象的實(shí)現(xiàn)應(yīng)該完全隱藏于使用他的對(duì)象)。例如,一個(gè)對(duì)象的實(shí)例變量(不是常量的成員域),應(yīng)該總是private。我意思是某段時(shí)期的,無例外的,不斷的。(你能夠偶爾有效地使用protected方法,但是protected實(shí)例變量是可憎的事)同樣的原因你應(yīng)該不用get/set函數(shù)---他們對(duì)于是一個(gè)域公用只是使人感到過于復(fù)雜的方式(盡管返回修飾的對(duì)象而不是基本類型值的訪問函數(shù)是在某些情況下是由原因的,那種情況下,返回的對(duì)象類是一個(gè)在設(shè)計(jì)時(shí)的關(guān)鍵抽象)。

這里,我不是書生氣。在我自己的工作中,我發(fā)現(xiàn)一個(gè)直接的相互關(guān)系在我OO方法的嚴(yán)格之間,快速代碼開發(fā)和容易的代碼實(shí)現(xiàn)。無論什么時(shí)候我違反中心的OO原則,如實(shí)現(xiàn)隱藏,我結(jié)果重寫那個(gè)代碼(一般因?yàn)榇a是不可調(diào)試的)。我沒有時(shí)間重寫代碼,所以我遵循那些規(guī)則。我關(guān)心的完全實(shí)用?我對(duì)干凈的原因沒有興趣。 脆弱的基類問題

現(xiàn)在,讓我們應(yīng)用耦合的概念到繼承。在一個(gè)用extends的繼承實(shí)現(xiàn)系統(tǒng)中,派生類是非常緊密的和基類耦合,當(dāng)且這種緊密的連接是不期望的。設(shè)計(jì)者已經(jīng)應(yīng)用了綽號(hào)“脆弱的基類問題”去描述這個(gè)行為?;A(chǔ)類被認(rèn)為是脆弱的是,因?yàn)槟阍诳雌饋戆踩那闆r下修改基類,但是當(dāng)從派生類繼承時(shí),新的行為也許引起派生類出現(xiàn)功能紊亂。你不能通過簡單的在隔離下檢查基類的方法來分辨基類的變化是安全的;而是你也必須看(和測試)所有派生類。而且,你必須檢查所有的代碼,它們也用在基類和派生類對(duì)象中,因?yàn)檫@個(gè)代碼也許被新的行為所打破。一個(gè)對(duì)于基礎(chǔ)類的簡單變化可能導(dǎo)致整個(gè)程序不可操作。

讓我們一起檢查脆弱的基類和基類耦合的問題。下面的類extends了Java的ArrayList類去使它像一個(gè)stack來運(yùn)轉(zhuǎn):

class Stack extends ArrayList
{
private int stack_pointer = 0;

public void push( Object article )
{
add( stack_pointer++, article );
}

public Object pop()
{
return remove( --stack_pointer );
}

public void push_many( Object[] articles )
{
for( int i = 0; i articles.length; ++i )
push( articles[i] );
}
}

甚至一個(gè)象這樣簡單的類也有問題。思考當(dāng)一個(gè)用戶平衡繼承和用ArrayList的clear()方法去彈出堆棧時(shí):

Stack a_stack = new Stack();
a_stack.push("1");
a_stack.push("2");
a_stack.clear();

這個(gè)代碼成功編譯,但是因?yàn)榛惒恢狸P(guān)于stack指針堆棧的情況,這個(gè)stack對(duì)象當(dāng)前在一個(gè)未定義的狀態(tài)。下一個(gè)對(duì)于push()調(diào)用把新的項(xiàng)放入索引2的位置。(stack_pointer的當(dāng)前值),所以stack有效地有三個(gè)元素-下邊兩個(gè)是垃圾。(Java的stack類正是有這個(gè)問題,不要用它).

對(duì)這個(gè)令人討厭的繼承的方法問題的解決辦法是為Stack覆蓋所有的ArrayList方法,那能夠修改數(shù)組的狀態(tài),所以覆蓋正確的操作Stack指針或者拋出一個(gè)例外。(removeRange()方法對(duì)于拋出一個(gè)例外一個(gè)好的候選方法)。

這個(gè)方法有兩個(gè)缺點(diǎn)。第一,如果你覆蓋了所有的東西,這個(gè)基類應(yīng)該真正的是一個(gè)interface,而不是一個(gè)class。如果你不用任何繼承方法,在實(shí)現(xiàn)繼承中就沒有這一點(diǎn)。第二,更重要的是,你不能夠讓一個(gè)stack支持所有的ArrayList方法。例如,令人煩惱的removeRange()沒有什么作用。唯一實(shí)現(xiàn)無用方法的合理的途徑是使它拋出一個(gè)例外,因?yàn)樗鼞?yīng)該永遠(yuǎn)不被調(diào)用。這個(gè)方法有效的把編譯錯(cuò)誤成為運(yùn)行錯(cuò)誤。不好的方法是,如果方法只是不被定義,編譯器會(huì)輸出一個(gè)方法未找到的錯(cuò)誤。如果方法存在,但是拋出一個(gè)例外,你只有在程序真正的運(yùn)行時(shí),你才能夠發(fā)現(xiàn)調(diào)用錯(cuò)誤。

對(duì)于這個(gè)基類問題的一個(gè)更好的解決辦法是封裝數(shù)據(jù)結(jié)構(gòu)代替用繼承。這是新的和改進(jìn)的Stack的版本:

class Stack
{
private int stack_pointer = 0;
private ArrayList the_data = new ArrayList();

public void push( Object article )
{
the_data.add( stack_poniter++, article );
}

public Object pop()
{
return the_data.remove( --stack_pointer );
}

public void push_many( Object[] articles )
{
for( int i = 0; i o.length; ++i )
push( articles[i] );
}
}

到現(xiàn)在為止,一直都不錯(cuò),但是考慮脆弱的基類問題,我們說你想要在stack創(chuàng)建一個(gè)變量, 用它在一段周期內(nèi)跟蹤最大的堆棧尺寸。一個(gè)可能的實(shí)現(xiàn)也許象下面這樣:

class Monitorable_stack extends Stack
{
private int high_water_mark = 0;
private int current_size;

public void push( Object article )
{
if( ++current_size high_water_mark )
high_water_mark = current_size;
super.push( article );
}

publish Object pop()
{
--current_size;
return super.pop();
}

public int maximum_size_so_far()
{
return high_water_mark;
}
}

這個(gè)新類運(yùn)行的很好,至少是一段時(shí)間。不幸的是,這個(gè)代碼發(fā)掘了一個(gè)事實(shí),push_many()通過調(diào)用push()來運(yùn)行。首先,這個(gè)細(xì)節(jié)看起來不是一個(gè)壞的選擇。它簡化了代碼,并且你能夠得到push()的派生類版本,甚至當(dāng)Monitorable_stack通過Stack的參考來訪問的時(shí)候,以至于high_water_mark能夠正確的更新。html教程

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
久久综合九色综合欧美亚洲| 成人av电影免费| 欧美老女人第四色| 你懂的在线观看| 国产一区二区在线播放视频| 国产精品啊v在线| 中文字幕一区二区在线视频| 日韩精品网站| 视频一区在线免费观看| 日本一二区不卡| 国产成年人在线观看| 性疯狂做受xxxx高清视频| 日韩不卡在线| 国产欧美欧洲在线观看| www.com在线观看| 亚洲欧美日本一区二区| 青青草成人在线观看| 欧美一区二区网站| 久久久成人av毛片免费观看| 欧美激情视频在线播放| 性久久久久久久久久久| 欧美日韩国产精品激情在线播放| 国产资源在线一区| 午夜影院网站| 久久99久久久| 亚洲精品久久久久久国| 粉嫩久久久久久久极品| 国产精彩免费视频| 亚洲精品无码久久久久久| 日本网站在线免费观看视频| 美女又黄又免费| 国产精品婷婷午夜在线观看| 和岳每晚弄的高潮嗷嗷叫视频| 亚洲成年人影院在线| 欧洲精品在线一区| 交100部在线观看| 亚洲欧美偷拍一区| 精品国产一区二区三区久久狼5月| 欧美日韩麻豆| 国产成人精品免费视频大全软件| 操操操com| 1024国产精品| 成人欧美一区二区三区的电影| 欧美激情视频播放| 男女爱爱视频免费| 国产精品久久久久久久久久精爆| 成人网中文字幕| 久久精品国产一区二区三区不卡| 99久久精品国产导航| 亚洲91av视频| 国产sm主人调教女m视频| 亚洲精品天堂| 清纯唯美亚洲色图| 波多野吉衣在线视频| 国产三级中文字幕| 四虎精品永久在线| 欧美新色视频| 亚洲国产一区二区在线播放| 亚洲日韩中文字幕在线播放| 视频在线日韩| 国产精品狼人色视频一区| jizzjizzjizz中国| 午夜在线视频观看日韩17c| 国产精品国产三级欧美二区| 国产美女精品在线观看| 日韩视频一二三| 一区二区三区 在线观看视频| 超碰福利在线观看| 久久久一本精品99久久精品66| 麻豆精品视频入口| 日产精品久久久久久久蜜臀| 精品久久久中文| 亚洲精品国精品久久99热一| 国产精品99久久久久久成人| 成人短视频在线看| 欧美日韩在线免费观看视频| 欧美丰满高潮xxxx喷水动漫| 2019中文字幕全在线观看| 午夜午夜精品一区二区三区文| 国产亚洲精品久久久久动| 青青草国产精品97视觉盛宴| 一二三区在线视频| 日韩av电影手机在线观看| 精品少妇无遮挡毛片| 中文字幕日韩久久| 性欧美videosex高清少妇| 一级黄色大片视频| 成人午夜短视频| 久久一区二区三区四区| 日韩免费在线观看视频| 不卡视频在线看| 国产99在线观看| 中文字幕免费观看| 日本福利一区二区三区| 四虎精品一区二区免费| 91精品久久久久久久蜜月| 精品国产二区在线| 999久久欧美人妻一区二区| 天天操夜夜做| 制服视频三区第一页精品| 精品久久久久久久久久久久久久久| 九九九久久国产免费| 日韩成人免费观看| 2019中文在线观看| 国产一区二区三区不卡在线| 成人免费看片98| 色资源网站在线观看| 国产视频资源| avav免费在线观看| 欧美另类极品| 国产xxxx孕妇| 爱情岛论坛亚洲首页入口章节| 欧美精品偷拍| 这里都是精品| 国产精品伦一区二区三区级视频频| 免费在线黄色影片| 视频在线观看一区二区| 黄大色黄女片18免费| 中文在线天堂库| av网页在线| 国产一区二区三区在线看麻豆| 国产一级免费在线观看| 9.1麻豆精品| 国产黄色免费网| 亚州av综合色区无码一区| 中文字幕一区二区三区在线观看| 日韩福利在线观看| 国产在线一二三区| 久久久.www| 天天躁日日躁狠狠躁喷水| 91福利在线视频| 精品久久久三级| 成人免费视频caoporn| 不卡一区二区三区视频| 日韩伦理在线一区| www.在线视频| 香蕉久久免费影视| 91无套直看片红桃在线观看| 精品福利视频一区二区三区| 亚洲精品无amm毛片| 日韩欧美国产亚洲| 91免费看片网站| 天堂av在线免费| 91精品小视频| 欧美在线视频导航| 九七电影院97理论片久久tvb| 亚洲在线激情| 好久没做在线观看| 5g影院5g天天爽永久免费影院| 久草这里只有精品视频| 亚洲日韩欧美视频| 欧美日本高清视频在线观看| 青娱乐国产精品视频| 国产精品免费福利| 欧美高清一级片在线| 国产精成人品2018| 亚洲国产高清一区二区三区| 一区二区三区中文| 紧缚奴在线一区二区三区| 91亚洲精品久久久蜜桃借种| 欧美日韩在线亚洲一区蜜芽| 亚洲色图日韩精品| 蜜臀久久99精品久久久久久| 久久久影视传媒| 激情福利在线| 亚洲国产日日夜夜| 国产精久久一区二区三区| 北条麻妃在线观看视频| 欧美一区二区三区爽爽爽| 国产成人精品免费久久久久| 免费在线看黄网址| 美女福利一区二区| 污视频网站免费看| 欧美高清性hdvideosex| 国产激情二区| 国产 欧美 日韩 在线| 日本一区二区三区久久| 男女视频免费看| 欧美猛男超大videosgay| 国产精品美女高潮无套| 在线视频不卡国产| 久久一区二区三区国产精品| 国产在线观看中文字幕| 伊人激情综合网| 日韩精品久久久久久免费| 麻豆一区二区三区视频| 91精品国产91久久久久久一区二区| 九九热精品免费视频| 欧美探花视频资源| 欧美激情第六页| jyzzz在线观看视频| www成人在线视频| 九色在线91| 欧美群妇大交群中文字幕| 顶臀精品视频www| 欧美xxxx三人交性视频| 国产区在线观看成人精品| 韩日视频一区| 免费人成黄页在线观看忧物| 欧美视频小说| 在线无限看免费粉色视频| 成人午夜免费视频| 极度色播免费播放视频| 麻豆freexxxx性91精品| 日韩av综合| 在线小视频你懂的| 天天影视网天天综合色在线播放| 91好吊色国产欧美日韩在线| 欧美黑人性生活视频| 天天躁日日躁狠狠躁av| 91在线网站| 中文字幕有码在线| 天天综合网天天综合色| 欧美人与动xxxxz0oz| 中文字幕+乱码+中文乱码www| 可以看av的网址| 国产福利一区二区三区在线视频| 国产成人一区二区在线观看| 91视频免费在线| 亚洲最新视频在线播放| 一个色综合导航| 久久www免费人成看片高清| 色狠狠桃花综合| 激情图片小说一区| 亚洲国产精品无码久久| 久久精选视频| 国产精品后入内射日本在线观看| 中文字幕在线永久在线视频2020| 中文天堂在线资源| 国产精品66| 久久久久久久久久久久久女国产乱| 少妇搡bbbb搡bbb搡打电话| 亚洲色婷婷久久精品av蜜桃| 精品国产一区二区三区久久久樱花| 在线免费观看高清视频色| 亚洲国产成人精品女人| 日韩欧美高清在线视频| 亚洲第一综合| 欧美久久久久久久| 国产特级毛片| 99riav国产精品视频| 国产欧美日韩在线看| 国产精品白丝jk白祙| 天堂在线亚洲视频| 亚洲色图17p| 欧美亚洲国产一区二区三区| 国产亚洲一区二区三区不卡| 欧美日韩一区二区三区69堂| 椎名由奈jux491在线播放| 国产91丝袜在线18| 亚洲最新av在线| 国产美女情趣调教h一区二区| 久久国产精品成人免费观看的软件| 亚洲成人av资源| 搞黄网站在线看| 日韩一区二区三区三四区视频在线观看| 99国产精品久久久久久久| 久久久国产午夜精品| 天天av天天翘| 在线观看自拍| 99视频精品全部免费在线| 高潮一区二区三区| 国产欧美日韩一区二区三区| 日本在线精品视频| 视频污在线观看| 国产精一品亚洲二区在线视频| 国产美女视频91| 草民午夜欧美限制a级福利片| 日韩一区二区高清| 欧美一区二区三区性视频| 一本色道久久综合精品婷婷| 一个人免费观看日本www视频| 日本精品视频在线播放| 无码人妻一区二区三区免费n鬼沢| 精品美女久久久久| 国产精选在线视频拍拍拍| 国产亚洲精品91在线| 青春草在线观看| 最近2018年在线中文字幕高清| 一区二区久久精品| 成人精品视频一区二区| 久久精品在线| 成人亚洲欧美日韩在线观看| 国语自产精品视频在线看抢先版结局| 毛片基地在线观看| 午夜精品一区二区三区视频| 丁香花高清电影在线观看完整版| 成人激情综合| 洋洋成人永久网站入口| 日本久久久久久久久| 国产精品久久久久久久美男| 360天大佬第二季在线观看| 国产富婆一区二区三区| 亚洲欧美日韩一区二区在线| 日韩在线资源| 色婷婷综合久久久久中文| 国产原创精品| 免费国产一区| 国产欧美一区二区三区国产幕精品| 今天的高清视频免费播放成人| 污视频软件在线观看| 麻豆91免费| 亚洲一区二区91| 日本一区视频在线播放| 国产伦精品一区二区三区视频金莲| 91在线观看污| 夜夜狠狠擅视频| 精品视频一区二区三区四区| 激情五月宗合网| 在线视频中文字幕一区二区| 日韩成人精品在线观看| 欧美特级黄色片| 久久久久国产免费| 精品国产伦理网| 成人国产精品久久久网站| 26uuu欧美| 拍拍拍无挡免费播放视频在线观看| 美女被久久久| 成人国产一区二区三区精品| 欧美黑人狂野猛交老妇| 午夜精品一区二区三区视频免费看| 亚洲国产中文字幕在线观看| 久久久久久久久久久久久久久| 欧美日韩亚洲国产一区| 亚洲第一男人天堂| 久久精品国产亚洲AV成人婷婷| 99久久亚洲精品日本无码| 日韩不卡视频在线|