終于翻開這本James都稱贊的java經典書籍了,發現比一般的英語書籍要難懂一些。但是里面的Item都是非常實用的,是java程序員應該理解的。
Creating and Destroying Object
Item 1:考慮用靜態工廠方法替代構造器 例如:public static Boolean valueOf(boolean b) { return (b?Boolean.TRUE:Boolean.FALSE); } 這樣的好處是方法有名字,并且它可以復用對象,不像構造器每次調用都產生新的對象。其次它還可以返回返回類型的子類。不好的地方是如果沒有public or protected構造器的類將不能被繼承。還有就是靜態工廠方法的名字和其他的靜態方法名字不容易區分。
Item 2:通過添加私有構造器來加強單例屬性(singletom property) 例如:public class Hello { private static final Hello Instance = new Hell();
private Hello() {} public static Hello getInstance() { return Instance;
} } 這個私有構造器只能在內部被使用,確保了單例模式! Item 3:避免創建重復的對象 對不可修改的對象盡量進行復用,這樣效率和性能都會提高。例如如果循環100次String s = new String("hello")將創建100個對象 循環100次String s = "hello";則只創建了一個對象。很好的進行了復用。
Item 4:用私有構造器來避免被實例化
例如public UtilityClass { private UtilityClass() {}
/// } 通常那些工具類是這么設計的
Item 5:消除絕對的對象引用
雖然java中使用gc來管理內存,但是如果不注意的話也會產生“內存泄漏”。例如下面的程序 public class Stack { private Object[] elements; private int size = 0; public Stack(int i) { this.elements = new Object[i]; } public void push(Object e) { ensure(); elements[size++] = e; } public Object pop() { if(size == 0) { //// } return elements[size--]; } private void ensure() { //// } } 標記的地方存在著內存泄漏的問題,因為當他被彈出棧的時候,它也沒有成為可回收的垃圾對象,Stack維護著他們的絕對的引用。將不能更改。改進的方法是如下的寫法 public Object pop() { if(size == 0) { //// } Object obj = elements[--size]; elements[size] = null; return obj; } 但是切忌不要濫用null。
Item 6:避免finalizer 垃圾回收器是低線程級別運行的且不能被強迫執行。System.gc()只是建議垃圾回收器收集垃圾,它可不一定馬上運行,而且垃圾回收器運行的時候會掛起其他線程導致程序停止響應。推薦使用的方法類似于 InputStream is = null;
try { is = /////; } finally { is.close(); } |