1. 程式人生 > >我的Effective Java 學習筆記(一)

我的Effective Java 學習筆記(一)

學習記錄,也是生活的一種記錄。

第一條:考慮用靜態工廠方法代替構造器

  1. 我們都是有身份證的人。

       靜態工廠方法與構造器不同的最大優勢就在於它們都是有個人身份id的,雖然構造方法能夠通過改名引數型別或者引數個數等來區分,但一定意義上也會給開發帶來一定的問題,因為不知道該呼叫哪個API,也因此常常會發生一些錯誤。更別說沒有註釋或者API文件時,那就是一種痛苦了,而靜態工廠方法則不同,我們可以每個靜態方法宣告一個ID,而且一般的命名規則離不開對方法的總體概況,當我們呼叫此類方法的時候,即使沒有文件或者註釋的幫助,也能清楚地瞭解到這個方法到底是拿來做什麼的。
    

構造方法

    public
Boolean(boolean b){ return b?Boolean.true:Boolean.false; }

靜態工廠方法

    public static Boolean valueof(boolean b){
         return b?Boolean.true:Boolean.false;
    }

2.不New更高效

    第二個優勢在於靜態方法每次呼叫時都不必去建立一個新的物件,相比於new()一個物件出來,而且你無法保證它不重複使用,後果就是帶來高昂的開銷。Effictive java說的更清楚:“靜態工廠方法能夠為重複的呼叫返回相同物件,這樣有助於類總能嚴格控制在某個時刻哪些例項應該存在,這種類被稱為例項受控的類(instance-controlled)”,避免了存在兩個相等的例項,類如果保持了這一點,能有效地提升效能。過多的建立不必要的重複物件,不僅讓程式碼變得冗餘,也會給程式碼的互查工作帶來不必要的苦惱,當然更重要的原因是它也不利於整個專案的效能。

3.返回更靈活

   Effictive java 上的原話是“靜態工廠方法與構造器不同的第三大優勢在於,它們可以返回原返回型別的任何子型別的物件”。乍看一下有點拗口,也一時沒理解。先上個例項程式碼
  public interface Service{
    ...//service methods
  }
  public interface Provider{
    Service newService(); 
    Provider(){
        //構造器
    }
  }
  public class Services{
     public static Service newInstance
(){ Provider p = new Provider(); return p.newService(); } }

對於構造器而言,返回的只能是Provider物件,而對於靜態方法,它返回了Service物件,在返回型別的選擇上比構造器更加靈活和多樣。(在這一點上LZ可能理解地不是特別深,大家有意見或者更好的看法,歡迎大家留言,謝謝)

4.簡潔就是效率

   對於程式碼的初學者來說,
Map<String,List<String>> m = new HashMap<String,List<String>>();

一定不陌生,你會發現當你型別引數越來越長的時候,這段程式碼會變得非常的複雜,冗餘甚至讓你痛苦。但如果HashMap提供了靜態工廠:

public static <K,V>HashMap<K,V> newInstance(){
    return new HashMap<K,V>();
}

那你以後的宣告就變成了:

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

怎麼樣,程式碼是不是簡潔很多?在大家以後建立自己常用的工具類的時候,可以參考此類方法,程式碼也會寫的非常地漂亮,讓人賞心悅目。