Effective Java 02 建立和銷毀物件

2021-06-15 21:14:48 字數 1596 閱讀 4769

第二章 建立和銷毀物件

第一條:考慮用靜態工廠方法代替建構函式

好處:1. 與建構函式不同,靜態工廠方法具有名字

使用靜態工廠方法建立物件可以讓使用者更容易讀懂,表述的更清楚。 因為靜態工廠方法有自己的名字,所以它們沒有建構函式那樣的限制,對於給定的原型特徵,可以有不止乙個靜態的工廠方法。如果乙個類看起來需要多個建構函式,並且它們的原型特徵相同,那麼應該考慮用靜態方法來代替其中乙個或多個建構函式,並且慎重的選擇它們的名字以便明顯地標示出它們的不同。

2. 與建構函式不同,它們每次被呼叫的時候,不要求非得建立乙個新的物件。

這樣可以避免建立重複的物件,靜態工廠方法可以返回同乙個物件。

靜態工廠方法可以為重複的呼叫返回同一物件,這也可以被用來控制「在某一時刻那些例項應該優先存在」。這樣做有兩個理由,第一,它使得乙個類可以保證是乙個singleton(單例模式)。第二,它使非可變類可以保證「不會有兩個相等的例項存在」,即當且僅當a == b的時候才有a.equals(b)為true。如果乙個類保證了這一點,那麼它的客戶可以用==操作代替equals()方法,其結果是實質性的效能提高。

3. 與建構函式不同,它們可以返回乙個原返回型別的子型別物件。這樣我們在選擇被返回物件的型別是就有了更大的靈活性。

這種靈活性的乙個應用是,乙個api可以返回乙個物件,同時又不使該物件的類成為公有的。以這種方式把具體的實現隱藏起來。

缺點:1. 類如果不含公有的或者受保護的建構函式,就不能被子類化。

2. 它們與其它的靜態方法沒有任何區別

靜態工廠方法的一般命名

valueof()、getinstance()

第二條 使用私有的建構函式強化singleton屬性

有兩種方法可以實現,第一種使用私有的建構函式,公有靜態成員是乙個final域

public class test{

public static final test instance = new test();

private test(){

第二種方法提供了乙個公有的靜態工廠方法,而不是公有靜態final域

public class test{

private static final test instance = new test();

pirvate test(){

public test getinstance(){

return instance;

第一種方法在效能上稍微領先,而第二種方法提供了靈活性。在不改變api的前提下,允許我們改變思想,可以把類作為singleton或者不做為singleton。

為了使乙個singleton類變成可序列化的,僅僅在宣告中加上"implements serializale"是不夠的,必須也提供乙個readresolve方法。否則的話,乙個序列化的例項在每次反序列化的時候,都會產生乙個新的例項。

第三條 通過私有建構函式強化不可例項化的能力

這種用法的***,使得乙個類不可能被子類化

第四條 避免建立重複的物件

第五條 消除過期物件的引用

只要乙個類自己管理它的記憶體,程式設計師就應該警惕記憶體洩露問題。記憶體洩露的另一種常見**是快取。

第六條 避免使用終結函式

終結函式不一定會被呼叫,也不一定會馬上被呼叫。

《effective Java》讀後筆記

為什麼區域性變數要宣告為 final 在jdk 1.8 之前,不用final修飾會編譯報錯。在jdk 1.8 中,不用final修飾不會報錯,但是一旦改變了變數的值就會報錯 區域性類如果乙個內部類需要在多個方法之外仍然是可見的,或者是它太長了,不適合於放在方法內部,就應該使用成員類。如果成員類的每個...

Effective Java閱讀筆記

通用程式設計 將區域性變數的作用域最小化,可以增強 的可讀性和可維護性,並降低出錯的可能性。要使區域性變數的作用域最小化,最有力的方法就是在第一次使用它的地方宣告。如果變數在使用之前宣告,只會造成混亂,過早地宣告區域性變數不僅會使它的作用域擴充套件,而且結束地也過於晚了。不要重新造輪子,一般而言,類...

Effective Java 學習筆記 6

及時消除不使用的物件的引用,理論上,帶有記憶體管理的語言是不存在記憶體洩漏的,但是如果對物件的操作不當,也是可能會造成記憶體洩漏.如有乙個stack,其pop函式如下.public object pop if element.length 0 return null return element s...