數據加載中……
          《Effective java》學習筆記1

          考慮用靜態工廠方法代替構造器

          Tips:這里的靜態工廠方法非設計模式的靜態工廠方法

          1、相對構造器的優勢:

          1.1、靜態工廠方法有名稱:

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

          1.2、不用每次調用的時候都新建一個對象

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

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

          Public static Boolean valueOf(Boolean b) {

                     Return b ? Boolean.TRUE : Boolean.FALSE;

          }

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

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

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

          API中實現就是CollecionCollections

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

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

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

          API中實現是 EnumSet

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

          Ps:查閱了下jdk api沒有找到相關的內容。不過理解上沒什么難度,根據傳入參數的量。底層動態選擇實現的方式而已。

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

          服務者框架:多個服務提供者實現了一個服務,系統為服務提供者的客戶端提供多個實現,并把他們從多個實現中解耦出來。

          服務提供者框架三個重要的組件:

          服務接口(Service Interface):提供者實現的;

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

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

          API中實現是JDBC的服務

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

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

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

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

          1.4、在創建參數化類型實例的時候,它們使代碼變得更加簡潔

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

          書中給的代碼實例如下:

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

                     return new HashMap<K, V>();

          }

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

          2、靜態工廠的缺點

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

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

             2.2、和其他靜態方法實際上沒有任何區別。

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

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


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


          網站導航:
           
          主站蜘蛛池模板: 连州市| 蒙自县| 汾西县| 宜君县| 开江县| 宁都县| 武义县| 岳池县| 丰台区| 湘潭市| 莫力| 乌兰浩特市| 大英县| 丰原市| 临安市| 四会市| 崇文区| 新闻| 乌苏市| 葫芦岛市| 湘阴县| 拉萨市| 皮山县| 洱源县| 河南省| 汕尾市| 海门市| 九江县| 高尔夫| 会泽县| 宿州市| 伊吾县| 商河县| 林芝县| 嘉荫县| 曲松县| 巍山| 永康市| 荆州市| 萨嘎县| 乌兰县|