2012-07-18 48 views
1

我正在創建一個實用程序類,它將用於(除其他之外)創建綁定到當前線程的新org.mozilla.javascript.Context對象。我有一個單一的全球JavaScript範圍,可能有幾個導入/初始化語句,等等。在Java中創建靜態單例模式

我希望外部類能夠通過簡單地使用Utility.getContext()來檢索Context對象和Scope對象以供將來執行Utility.getScope(),而不必明確使用getInstance()函數。單例模式是必要的,因爲上下文和範圍都需要是單個實例。

以下代碼是否有意義?

public class Utility { 
    private static Utility instance; 
    private static ScriptableObject scope = null; 

    private Utility() {} 

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

    private static Context getSingletonContext() { 
     Context context = Context.getCurrentContext(); 
     if (context == null) 
      context = Context.enter(); 
     if (scope == null) { 
      scope = new ImporterTopLevel(context); 
      Script script = context.compileString("Global JavaScript Here","Script Name",1,null); 
      script.exec(context,scope); 
      scope.sealObject(); 
     } 
     return context; 
    } 

    public static Context getContext() { 
     return getInstance().getSingletonContext(); 
    } 

    public static Scriptable getScope() { 
     Scriptable newScope = getContext().newObject(scope); 
     newScope.setPrototype(scope); 
     newScope.setParentScope(null); 
     return newScope; 
    } 
} 
+0

似乎你不有鎖定上下文和範圍的單身人士,所以你不能保證那些人會成爲單身人士。 – Arcymag 2012-07-18 04:45:20

+3

也許更適合[codereview](http://codereview.stackexchange.com/)。 – 2012-07-18 04:45:22

+0

Java和JavaScript結合在一起? Java的ception。 – 2012-07-18 04:56:12

回答

4

讓這個公共

public static Utility getInstance() 

2.沒有必要使在類的所有方法靜態除本getInstance()方法。

3.當您試圖在其他類中訪問此類的單例對象時,可以這樣做。

Utility ut = Utility.getInstance(); 

看,這就是爲什麼你不需要做出的實用工具類的靜態方法除了getInstance()

4.有三種方式來獲得辛格爾頓

我。同步方法

ii。具有雙重檢查鎖定的同步語句。

iii。初始化在定義時靜態對象參考變..

如:

在定義時初始化靜態對象參考變

private static Utility instance = new Utility(); 

private Utility() {} 

    private static Utility getInstance() { 

      return instance;     // WILL ALWAYS RETURN SINGLETON 
             // REFER HEAD FIRST DESIGN PATTERN BOOK FOR DETAILS 

    } 
+1

+1。請不要使用[*「雙重檢查鎖定」*)(http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html) – alfasin 2012-07-18 04:54:29

+1

@alfasin:雙重檢查鎖定工作正常自1.5起,只要實例字段變成「易失性」。你鏈接的那個頁面甚至說了很多。 – cHao 2012-07-18 04:56:33

+0

當從其他類引用我的類時,我希望能夠直接調用getContext和getScope,而無需調用getInstance。由於這些方法完全獨立於應用程序中的其他任何東西,所以靜態定義更合適嗎? – user1533553 2012-07-18 04:58:20