<var id="xrdpp"><strike id="xrdpp"><listing id="xrdpp"></listing></strike></var>
<cite id="xrdpp"><video id="xrdpp"></video></cite><var id="xrdpp"><video id="xrdpp"><thead id="xrdpp"></thead></video></var>
<cite id="xrdpp"><video id="xrdpp"><menuitem id="xrdpp"></menuitem></video></cite><var id="xrdpp"></var>
<var id="xrdpp"><strike id="xrdpp"><listing id="xrdpp"></listing></strike></var>
<cite id="xrdpp"><video id="xrdpp"><var id="xrdpp"></var></video></cite>
<var id="xrdpp"></var>
<cite id="xrdpp"><video id="xrdpp"></video></cite>
<var id="xrdpp"><video id="xrdpp"><thead id="xrdpp"></thead></video></var>
您現在的位置: 弘智首頁 > JAVA > JAVA資料下載 >

關于能提高Java代碼可重用性的三個措施(中)

時間:2012-10-31 10:54 來源:弘智培訓

從類的名字pPolygon可以看出,該類所封裝的過程主要與Polygon類型的對象有 關。名字前面的p表示該類的唯一目的是組織公用靜態過程。在Java中,類的名字以小寫字母開頭是一種非標準的做法,但象pPloygon這樣的類事實上 并不提供普通Java類的功能。也就是說,它并不代表著一類對象,它只是Java語言組織代碼的一種機制。

在上面這個例子中,改動代碼的最終效果是使得應用Polygon功能的客戶代碼不必再從 Polygon繼承。Polygon類的功能現在已經由pPolygon類以過程為單位提供?蛻舸a只使用自己需要的代碼,無需關心 Polygon類中自己不需要的功能。但它并不意味著在這種新式過程化編程中類的作用有所削弱。恰恰相反,在組織和封裝對象數據成員的過程中,類起到了不 可或缺的作用,而且正如本文接下來所介紹的,類通過多重接口實現多態性的能力本身也帶來了卓越的代碼重用支持。然而,由于用實例方法封裝代碼功能并不是首 選的代碼重用手段,所以通過類繼承達到代碼重用和多態性支持也不是最理想的。

措施二:把參數類型改成接口

正如Allen Holub在《Build User Interfaces for Object-Oriented Systems》中所指出的,在面向對象編程中,代碼重用真正的要點在于通過接口參數類型利用多態性,而不是通過類繼承:

“……我們通過對接口而不是對類編程達到代碼重用的目的。如果某個方法的所有參數都是對一些已知接口的引用,那么這個方法就能夠操作這樣一些對象:當我們編寫方法的代碼時,這些對象的類甚至還不存在。從技術上說,可重用的是方法,而不是傳遞給方法的對象。”

在“措施一”得到的結果上應用Holub的看法,當某塊代碼能夠編寫為獨立的全局過程時,只 要把它所有類形式的參數改為接口形式,我們就可以進一步提高它的可重用能力。經過這個改動之后,過程的參數可以是實現了該接口的所有類的對象,而不僅僅是 原來的類所創建的對象。由此,過程將能夠對可能存在的大量的對象類型進行操作。

例如,假設有這樣一個全局靜態方法:

以下是引用片段:
static public boolean contains(Rectangle rect, int x, int y) {...} 

這個方法用于檢查指定的點是否包含在矩形里面。在這個例子中,rect參數的類型可以從Rectangle類改變為接口類型,如下所示:

以下是引用片段:
static public boolean contains(Rectangular rect, int x, int y) {...} 

而Rectangular接口的定義是:

以下是引用片段:
public interface Rectangular 
{
Rectangle getBounds();

現在,所有可以描述為矩形的類(即,實現了Rectangular接口的類)所創建的對象都可以作為提供給pRectangular.contains()的rect參數。通過放寬參數類型的限制,我們使方法具有更好的可重用性。

不過,對于上面這個例子,Rectangular接口的getBounds方法返回 Rectangle,你可能會懷疑這么做是否真正值得。換言之,如果我們知道傳入過程的對象會在被調用時返回一個Rectangle,為什么不直接傳入 Rectangle取代接口類型呢?之所以不這么做,最重要的原因與集合有關。讓我們假設有這樣一個方法:

以下是引用片段:
static public boolean areAnyOverlapping(Collection rects) {...} 
該 方法用于檢查給定集合中的任意矩形對象是否重疊。在這個方法的內部,當我們用循環依次訪問集合中的各個對象時,如果我們不能把對象cast成為 Rectangular之類的接口類型,又如何能夠訪問對象的矩形區域呢?唯一的選擇是把對象cast成為它特有的類形式(我們知道它有一個方法可以返回 矩形),它意味著方法必須事先知道它所操作的對象類型,從而使得方法的重用只限于那幾種對象類型。而這正是前面這個措施力圖先行避免的問題!
主頁 | 我們介紹 | 我們課程 | 開課公告 | 無錫學歷培訓 | XML地圖
欧美Av无码高清在线_岛国在线无码高清视频_无码国模国产在线观看_第一福利在线永久视频
<var id="xrdpp"><strike id="xrdpp"><listing id="xrdpp"></listing></strike></var>
<cite id="xrdpp"><video id="xrdpp"></video></cite><var id="xrdpp"><video id="xrdpp"><thead id="xrdpp"></thead></video></var>
<cite id="xrdpp"><video id="xrdpp"><menuitem id="xrdpp"></menuitem></video></cite><var id="xrdpp"></var>
<var id="xrdpp"><strike id="xrdpp"><listing id="xrdpp"></listing></strike></var>
<cite id="xrdpp"><video id="xrdpp"><var id="xrdpp"></var></video></cite>
<var id="xrdpp"></var>
<cite id="xrdpp"><video id="xrdpp"></video></cite>
<var id="xrdpp"><video id="xrdpp"><thead id="xrdpp"></thead></video></var>