[英]java singleton of parameterized class
我無法擺脫這種糾結。
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進行靜態引用。不過,我仍想構建一個可參數化的單例類。
問題在於,在Java中(與.NET不同),無論您提供多少個不同的類型參數,您都只有一個靜態變量-因此MySingleton<Foo>._instance
等於MySingleton<Bar>._instance
。
我懷疑您想要Map<Class<? extends AUsefulClass>, MySingleton>
Map<Class<? extends AUsefulClass>, MySingleton>
,取消了有關原始類型的警告。 然后,您將使instance
方法也帶有Class<T>
參數,這樣它將知道要查找的內容。
當然,這是假設您要為不同類型的參數使用單獨的狀態。 如果您不需要 MySingleton<Foo>
和MySingleton<Bar>
其他狀態,則可以真正擁有一個實例,並在取消未經檢查的轉換警告的同時對其進行轉換。
這是一個解決方案:
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
,顯然您將不得不省略final修飾符,並且還要基於type
參數實現狀態(通過存儲它以供再次使用)。
編輯 :如果用戶將其他類型傳遞給原始類型,則會出現問題。 然后,無論如何都可能要存儲類型,因此可以檢查對getInstance(Class<T>)
任何后續調用是否有效。
在這種情況下,我寧願看一下我的設計。 另外,如果您要根據情況創建其他單例。 首先,您可能會使用工廠實例化單例。
我不確定單例模式是否是一種好方法,它是否通過對象引入了全局狀態,而這正是您可能不想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.