Effective Java學習筆記Java語言支持四種基本類型:接口(Interface)、類(Class)、數組(Array)、和原語類型(Primitive)。前三種類型通常被稱為引用類型(reference type),類的實例和數組是對象(object),而原語類型的值不是對象。一個類的成員(member)包括它的域(fIEld),方法(method),成員類(member class)和成員接口(member interface)。一個方法的原型(signature)包括它的名字和所有形參的類型,方法原型不包括它的返回類型。
第一條:考慮用靜態工廠方法代替構造函數對於一個類,為了得到一個實例,最通常的方法是提供公有的構造函數NEW一個。另外一種方法是可以通過提供一個靜態工廠方法(static factory method),它返回的是類的一個實例。下面是Singleton模式中的靜態方法,返回類的唯一實例。public static A getInstance() { return INSTANCE;}
靜態工廠方法的好處:(1)靜態方法具有名字。如果一個構造函數的參數並沒有確切地描述被返回的對象,那麼選用適當名字的靜態工廠可以使一個類更易於使用,並且相應的客戶代碼更易於閱讀。(2)靜態方法在每次調用的時候,不要求非得創建一個新的對象。靜態工廠方法可以為重復的調用返回同一個對象。(例如Singleton模式)(3)靜態方法可以返回一個原返回類型的子類型的對象。(這一點經常被用在基於接口的框架結構中,及抽象工廠模式,在Java的Collections Framework中有一個 Java.util.Collections類,裡面就有很多有用的靜態方法,它是通過返回接口來引用一個被隱藏起來的實現類的實例)。
靜態工廠方法的主要缺點:(1)類如果不含公有的或者受保護的構造函數,就不能被子類化。(鼓勵使用復合結構而不是繼承)(2)與其它的靜態方法沒有任何區別。其中用[valueOf]作名字的一般是類型轉換操作,而名字[getInstance]方法返回實例。總結:靜態工廠方法和公有的構造函數各有各自的用途,理解各自的長處以便更合理的設計類的結構。
第四條:避免創建重復的對象作為一個極端的反面例子,考慮下面的語名:String s = new String("sample"); //Don't do this! 該語句每被執行一次都會創建一個新的String實例(以前有點不太理解一句話:String對象是一個不可變字符串,而StringBuffer對象是一個可變字符串。這個不可變和可變讓我不知如何想象,當我用一個String對象作為引用傳給一個方法,再在方法體中改變它的值,但是在調用該方法後,外邊的值依然沒有改變,這不符合Java中的引用規則,才想到String對象的特殊性:不可變字符串)在開發工作中,經常會在方法體中實例化對象,在這個方法有可能被頻繁調用並且實例化的對象是相同的實例時,應該考慮把這個實例化的對象放到方法體外來定義和實例化。從而避免創建重復的對象。另一方面,由於小對象的構造函數只做很小量的工作,所以,小對象的創建和回收動作是非常廉價的,特別是在現代的JVM實現上更是如此。通過創建附加的對象以使得一個程序更加清晰、簡潔、功能強大,這往往是一件好事。