1. 程式人生 > >Helper 類在Java和C 中的設計

Helper 類在Java和C 中的設計

               

Java

有三個選擇

1)採用普通的類

有公有建構函式,沒有成員變數,提供了很多成員函式作為方法,呼叫程式碼如下:

Helper helper = new Helper();

helper.f1();

這種方法的缺點是建立物件的開銷是不必要的,我們知道建立物件意味著,首先要分配記憶體,然後在該記憶體上建立物件。在一個大量建立helper物件的場景中,這種負擔是很大的。

2)為了避免這種反覆建立物件的開銷,可以採用Singleton延遲建立技術,確保整個程序中只有一個物件,並且只有第一次呼叫的時候才會被創建出來。

Helper helper = Helper.getInstance();

helper.f1();

這個方法進步很多了,但是仍然有缺點。這會導致系統中有很多Singleton類。其實Singleton主要用在表達系統中唯一存在的物件,通常這些物件都是有狀態的。一個系統設計中過多的為了其他目的而設計的Singleton會讓開發者覺得困惑。因此,如果一個類沒有成員變數,應該優先設計成Helper類,而不是Singleton

3)普通的類,提供靜態方法訪問,建構函式為私有。同時用final關鍵字修飾class表示不允許被繼承。

Helper.f1();

由於私有建構函式,因此不可以被直接建立物件,也不可以被子類繼承後,然後建立子類物件。如果必要的話,還可在私有建構函式中丟擲異常,以防止reflection的攻擊。

我認為這是Java中最好的方案。

下面是我的JDBC方面的一個Helper類程式碼:

import java.sql.Statement;

import java.sql.ResultSet;

import java.sql.SQLException;

import org.slf4j.Logger;

public final class CloseHelper {

  private CloseHelper(){

  throw newUnsupportedOperationException("CloseHelper is a helperclass,can't be initated");

  }

  public static void close(ResultSetset , Logger log){

  if(set!=null){

    try{

      set.close();

    }catch(SQLException ex){

      log.error(ex.getMessage(),ex);

    }

  }

  }

  public static void close(Statementstatement , Logger log){

  if(statement!=null){

    try{

      statement.close(); 

    }catch(SQLException ex){

      log.error(ex.getMessage(),ex);

    }

  }

  }

}

C++

同樣的推理,同樣的結論。但是C++中缺少程式碼檢查工具,如果忘記將建構函式變成私有,Java的檢查工具通常會提醒。C++只能靠制定編碼規範來解決。而且C++中也沒有final關鍵字來表示類不允許被繼承。