<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    數(shù)據(jù)加載中……
    《Effective java》學(xué)習(xí)筆記1

    考慮用靜態(tài)工廠方法代替構(gòu)造器

    Tips:這里的靜態(tài)工廠方法非設(shè)計模式的靜態(tài)工廠方法

    1、相對構(gòu)造器的優(yōu)勢:

    1.1、靜態(tài)工廠方法有名稱:

    因為構(gòu)造器只能有一個特定的簽名,所以要提供多個構(gòu)造器必須要通過參數(shù)列表的順序上不同來實現(xiàn),這樣要求用戶記住各種構(gòu)造器,如果沒有相關(guān)文檔,容易出現(xiàn)錯誤。(eclipse中有自動檢測功能,不過從語言的角度這樣還是有問題的)而對于靜態(tài)工廠方法,當(dāng)一個類需要多個帶有相同標簽名得構(gòu)造器時,就用靜態(tài)工廠方法代替構(gòu)造器,并慎重的選擇名稱以便突出它們之間的區(qū)別

    1.2、不用每次調(diào)用的時候都新建一個對象

    Java中創(chuàng)建對象的成本是非常大的,因此使用靜態(tài)工廠方法的同時,可以預(yù)先構(gòu)建好的實例,或者將構(gòu)建好的實例緩存起來,進行重復(fù)利用,避免創(chuàng)建不必要的對象。

    Such as :Boolean.valueOf(),永遠不創(chuàng)建對象

    Public static Boolean valueOf(Boolean b) {

               Return b ? Boolean.TRUE : Boolean.FALSE;

    }

    Ps:我們自己寫程序的時候,可以通過enum來控制類在某個時刻那些實例存在。這些類被稱為實例受控的類。

    1.3、可以返回返回原類型的任何子類型的對象

    1.3.1、這里將類得子類進行隱藏,通過API返回對象,同時又不會使對象的類變成共有。同時這也為針對接口編程提供了便利。因為接口不能有靜態(tài)方法(靜態(tài)方法屬于類所擁有),則將接口Types中的靜態(tài)工廠方法被放在一個名為Types的不可實例化的類中。

    API中實現(xiàn)就是CollecionCollections

    Collectionjava中的集合類的接口,它提供了集合類所共有的方法

    Collections是由Collection上進行操作或返回Collection的靜態(tài)方法組成。例如它提供了不可修改的集合,同步集合等。通過這種方式比導(dǎo)出32個獨立公有類得實現(xiàn)方式要小得多。

    1.3.2、公有的靜態(tài)工廠方法所返回的對象的類不僅可以是非公有的,而且該類還可以隨著每次調(diào)用而發(fā)生變化,這取決于靜態(tài)工廠方法的參數(shù)值。

    API中實現(xiàn)是 EnumSet

    書中說:如果它的元素有64個或者更少,靜態(tài)工廠方法就返回了一個RegalarEnumSet實例,用單個long支持;如果枚舉類型有65個或者更多的元素,工廠就返回JumboEnumSet類型,用long數(shù)組進行支持。

    Ps:查閱了下jdk api沒有找到相關(guān)的內(nèi)容。不過理解上沒什么難度,根據(jù)傳入?yún)?shù)的量。底層動態(tài)選擇實現(xiàn)的方式而已。

    1.3.3、靜態(tài)工廠方法返回的對象所屬的累,在編寫該靜態(tài)工廠方法的類時可以不必存在。

    服務(wù)者框架:多個服務(wù)提供者實現(xiàn)了一個服務(wù),系統(tǒng)為服務(wù)提供者的客戶端提供多個實現(xiàn),并把他們從多個實現(xiàn)中解耦出來。

    服務(wù)提供者框架三個重要的組件:

    服務(wù)接口(Service Interface):提供者實現(xiàn)的;

    提供者注冊的API(provider Registration API),系統(tǒng)用來注冊實現(xiàn)的,讓客戶端返回它們的

    服務(wù)訪問API(Service Registration API),客戶端用來獲取服務(wù)的實例的。

    API中實現(xiàn)是JDBC的服務(wù)

    每個db提供自己的*.Jar包來實現(xiàn)DB的操作即Driver,它們遵從一套標準。這就是服務(wù)接口

    JDK中提供的DriverManagere.registerDriver是提供者注冊的API,

    DriverManager.getConnection()是服務(wù)訪問API.

    Ps:如果對這一部分不是很理解的話,強烈推薦原書中P7code…一看就明白了

    1.4、在創(chuàng)建參數(shù)化類型實例的時候,它們使代碼變得更加簡潔

    這里面主要提到的是類型推導(dǎo)(type reference)。所謂類型推導(dǎo),即根據(jù)你定義的返回對象的類型來推導(dǎo)實例化的類型(個人感覺雖然很方便,有點不靠譜啊)

    書中給的代碼實例如下:

    Public static <K,V> HashMap<K, V> newInstance() {

               return new HashMap<K, V>();

    }

       Map<Strinng, List<String>> m = HashMap.newInstance();

    2、靜態(tài)工廠的缺點

       2.1、類如果不含公有的或者受保護的構(gòu)造器,就不能被子類化。

           這里的主要原因就是,子類的方法的范圍權(quán)限比父類更嚴格。書中也提到了,這其實是個優(yōu)點。因為組合比繼承更應(yīng)該用。

       2.2、和其他靜態(tài)方法實際上沒有任何區(qū)別。

           這個純粹是從java doc方便查詢的角度來說的,so I don’t care it

    posted on 2011-04-30 09:58 潘潘.eagle 閱讀(315) 評論(0)  編輯  收藏 所屬分類: JAVA


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲精品视频在线观看你懂的| 豆国产96在线|亚洲| 亚洲女人被黑人巨大进入| 国产精品视频免费观看| 两个人看www免费视频| 美女被免费视频网站a| 亚洲一区二区三区久久| 亚洲成人动漫在线| 亚洲精品综合久久| 国产成人免费手机在线观看视频 | 亚洲人成无码网站久久99热国产| 久久精品无码一区二区三区免费| 午夜视频在线免费观看| 久久久免费观成人影院| 免费一级特黄特色大片| 日韩国产精品亚洲а∨天堂免| 亚洲国产乱码最新视频| 亚洲制服丝袜在线播放| 久久亚洲AV无码精品色午夜麻豆| 亚洲精品白浆高清久久久久久| 亚洲乱码日产精品a级毛片久久| 国产免费观看a大片的网站| 毛片视频免费观看| 国产在线观看片a免费观看| 麻豆视频免费观看| h视频在线观看免费网站| 97在线视频免费| 久久综合国产乱子伦精品免费| 免费在线看黄网站| 毛片在线播放免费观看| 免费观看在线禁片| 国产成人一区二区三区视频免费| AAA日本高清在线播放免费观看| 国产免费无码AV片在线观看不卡| 中文字幕在线免费观看视频| 99精品视频免费| a在线免费观看视频| 国产精品免费一区二区三区四区| 99在线观看精品免费99| 免费黄色网址网站| 黄瓜视频高清在线看免费下载|