2011-02-22 46 views
2

我無法弄清楚這個問題。參數化類的java單例

public class MySingleton<T extends AUsefulClass>{ 
    Map<String, T> myUsefulRegistry; 
    private static MySingleton<T> _instance = null; 

    public static instance(){ 
     if(instance == null) 
      _instance = new MySingleton<T>(); 

     return _instance; 
    } 
} 

public class Test{ 
    @Test 
    public void testThis(){ 
     MySingleton<SomeClass> mySingleton = MySingleton<SomeClass>().instance(); 
    } 
} 

此參數化是錯誤的,因爲你不能讓一個靜態引用非靜態T.不過,我想建立一個參數化單例類。

+0

爲什麼你需要一個單身人士?給我們更多的信息。 – someguy 2011-02-22 18:45:48

回答

4

問題是,在Java中(不像.NET),無論您提供多少種不同類型的參數,您只有一個靜態變量 - 因此MySingleton<Foo>._instance等於MySingleton<Bar>._instance

我懷疑你想要一個Map<Class<? extends AUsefulClass>, MySingleton>,禁止關於原始類型的警告。那麼你會讓你的instance方法也參數爲Class<T>,所以它會知道要查找什麼。

當然,這是假設你想爲不同的類型參數分開狀態。如果你不需要需要MySingleton<Foo>MySingleton<Bar>的不同狀態,你可以真正擁有一個實例,並且只需強制轉換它,同時抑制未經檢查的轉換警告。

0

這裏有一個解決方案:

public class MySingleton { 
    private static MySingleton instance; 

    private final Map<String, ?> myUsefulRegistry; 

    private <T> MySingleton(Class<T> type) { 
     myUsefulRegistry = new HashMap<String, T>(); 
    } 

    public static <T> MySingleton getInstance(Class<T> type) { 
     if (instance == null) { 
      instance = new MySingleton(type); 
     } 
     return instance; 
    } 
} 

如果在重新分配myUsefulRegistry規劃,你會明顯有省略最後修改,也將它存儲再次使用實現基於type參數(州)。

編輯:如果用戶將不同的類型傳遞給原件,則會出現問題。您可能希望在任何情況下都存儲該類型,因此您可以檢查是否有任何前往getInstance(Class<T>)的呼叫有效。

0

我寧願看看我的設計在這種情況下。另外,如果你想創建一個不同的singleton應有的情況。您可能會首先使用工廠來實例化單例。

我不知道如果單例模式是一個好方法,它通過對象引入全局狀態,這是你可能不想要的東西。