2013-05-21 88 views
0

我使用私有構造函數傳遞了一個類,但通過調用私有構造函數,該對象由另一個公共方法返回。當我們可以使構造函數公開時,這種構造的優點是什麼?通過公共方法初始化的私有構造函數

public final class TokenTable { 

    static public int errorToken = 0; 
    static public int timesToken = 1; 
    static public int divToken = 2; 
    static public int plusToken = 11; 
    ...... 
    ...... 

    private final HashMap<String, Integer> keywordMap = new HashMap(); 
    private final HashMap<String, Integer> operationMap = new HashMap(); 

    private TokenTable() { 

     operationMap.put("*", timesToken); 
     operationMap.put("/", divToken); 
     operationMap.put("+", plusToken); 
     .... 



    } 


    static public TokenTable getInstance() { 

      LexTokenTabInstance = new TokenTable(); 
      return LexTokenTabInstance; 
    } 

} 
+0

我不得不說,我是一個有點失望的是,這裏的大部分答案都帶來了單身。我猜這是'getInstance()'的名字(這是單體getter的最常見名稱之一)......但仍然如此。 – cHao

+0

@cHao如果您對目前的答案不滿意,爲什麼不創建自己的答案?如果你覺得有比所提供的更好的答案,我會好奇的閱讀它。 – Supericy

+0

@Supericy:因爲這裏有兩個很好的,已經說了很多我會。這是其他人壓抑我。 – cHao

回答

5

這就是所謂的Factory模式。檢查描述here - Factory Design Pattern

有幾個優點:

  • 你可以有多個命名的工廠方法來創建對象的不同口味,可以允許與同一組參數類型
  • 你可以返回一個單身,如果超載適當也許返回緩存實例集合的一個
  • 如果使用泛型時不需要使用new
  • ,泛型類型由編譯器推斷所以不需要使用<>運營商
  • 你可以返回一個接口,而不是具體的類
  • 的允許構造預初始化

需要明確的是,上面的(例如,如果初始化必須在調用基類構造函數之前完成)例如,它似乎只是作爲一種「良好做法」,因爲沒有使用上述功能(除了不必使用「新」)。

+2

應該注意的是,如果你不需要任何這些優點,普通的公共構造函數就會帶來一點點的精神包袱。即:不要把所有東西都變成一個工廠,只是因爲它變得很炫。 :) – cHao

0

隱藏類的構造函數的主要原因是控制如何創建該類的對象。一個常見的例子是單例模式,其中只有一個類的一個對象被實例化。

爲了監管此事,用戶訪問,將訪問私有的構造函數,如果不創建對象,否則返回參照已創建對象的靜態方法:

public class SingletonDemo { 
    private static volatile SingletonDemo instance = null; 

    private SingletonDemo() {  } 

    public static SingletonDemo getInstance() { 
      if (instance == null) { 
        synchronized (SingletonDemo.class){ 
          if (instance == null) { 
            instance = new SingletonDemo(); 
          } 
        } 
      } 
      return instance; 
    } 
} 

對於其他例如,看一般工廠模式:http://en.wikipedia.org/wiki/Factory_method_pattern

3

這被稱爲工廠方法。工廠方法擁有一個構造許多優點:

  • 它有一個名字(和多個工廠方法可以有不同的名稱)
  • 它允許返回,而不是一個新實例
  • 它允許返回緩存實例子類的實例,而不是實際的類
0

如果您不想保護多個實例的創建類的外部,那麼你可以創建私有的構造。
這有助於創建單個實例。
你可以不喜歡它(預先加載):

private static final TokenTable tokenTable = new TokenTable(); 

static public TokenTable getInstance() { 

      return tokenTable; 
    } 

或者,你可以不喜歡它(延遲加載):

private static TokenTable tokenTable; 

static public TokenTable getInstance() { 
     if(null == tokenTable){ 
     tokenTable = new TokenTable(); 
     } 
      return tokenTable; 
    } 
+0

請注意,延遲加載示例不是線程安全的。 :P您通常會將該函數標記爲「synchronized」,或者在類上明確同步或進行其他操作。 – cHao

+0

好的超,感謝這個有價值的信息。 –

相關問題