我的Effective Java 學習筆記(一)
阿新 • • 發佈:2019-02-07
學習記錄,也是生活的一種記錄。
第一條:考慮用靜態工廠方法代替構造器
我們都是有身份證的人。
靜態工廠方法與構造器不同的最大優勢就在於它們都是有個人身份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();
怎麼樣,程式碼是不是簡潔很多?在大家以後建立自己常用的工具類的時候,可以參考此類方法,程式碼也會寫的非常地漂亮,讓人賞心悅目。