1. 程式人生 > >Java物件學習之建立物件——使用靜態工廠方法代替構造器優點(四)

Java物件學習之建立物件——使用靜態工廠方法代替構造器優點(四)

最近學習Android知識,發現Java好多的基礎知識運用的真的很一般,所以決定在重新梳理一下,現在Kotlin也來了,在Android之路上,留給我看Java的時間不多了。

      靜態我們就來簡單介紹一下,使用靜態工廠方法建立物件相較於構造器建立的物件的優缺點。主要概括如下:

優點:

  • 靜態工廠方法有名稱,可以明確的建立對應功能和屬性的Java物件
  • 靜態工廠方法可以預構建Java物件,實現在必要的情況下建立儘量少的物件例項
  • 靜態工廠方法可以獲取預構建Java物件的任何子類物件
  • 靜態工廠方法在構建引數化例項的時候,程式碼更簡潔

缺點:

  • Java類如果沒有公有的或者受保護的構建器,就不能被子類化
  • 靜態工廠方法和一般靜態方法沒有任何區別

靜態工廠方法與構造器建立Java物件的對比已經介紹完了,下面就來針對優點當中的第四條結合程式碼說明一下。特別說明,今天介紹的是針對JDK1.6以及以下,高版本不存在今天介紹的問題了。還有就是沒有介紹優點三直接介紹優點四是因為第三條有點難,需要好好理解一下。

 

1,靜態工廠方法可以在構建引數化例項的時候使程式碼更簡潔

 

這裡說到我們的引數化例項不得不提到我們的集合框架了,比如我們建立一個Map物件:

HashMap<String,String> map=new HashMap<String,String>();

當然了,這是jdk1.6以及之前的,在1.7以及以上版本,我們就可以寫成:

HashMap<String,String> map=new HashMap<>();

我們可以看出在1.6以及更低版本,我們在定義這樣引數化例項物件的時候寫了很多重複的程式碼,可能這個示例看不出來,那我再舉一個例子你就明白啦:

HashMap<String, HashMap<String, ArrayList<LinkedList<TreeMap<HashMap<String, TreeSet<Integer>>, ArrayList<String[]>>>>>> map =
        new HashMap<String, HashMap<String, ArrayList<LinkedList<TreeMap<HashMap<String, TreeSet<Integer>>, ArrayList<String[]>>>>>>();

這樣一個例子是不是覺得這種方式構建引數化示例優點程式碼冗餘了。所以我們只需要通過靜態工廠方法就可以解決這個問題:

 

public static <K,V>  HashMap<K,V> getSelfHashMap(){

    return new HashMap<K,V>();

}

這樣,我只需要通過如下方式就可以獲取例項了,程式碼要相對簡潔不少:

HashMap<String,HashMap<String,ArrayList<LinkedList<TreeMap<HashMap<String,TreeSet<Integer>>,ArrayList<String[]>>>>>> m1
        =getSelfHashMap();

正因為這種方式的優點,所以在1.7以及更高版本的JDK中我們就不用想上面那樣寫過多冗餘的程式碼了。這部分由於版本問題,現在意義不大。