作者:mingjava
    終于翻開這本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();
}