簡體   English   中英

java參數化類的單例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM