2014-03-03 25 views
0

我想要一個通用單例的原因如下。Java中的通用Singleton問題

我有一個類XMLParser,它包含解析給定的XML的方法,並出來與該XML的POJO。

List<Student> studentList = XMLParser.getInstance().parse(Student.class, xml , String args[]); 

現在是有意義的使XMLParser的類單身,因爲它沒有任何意義有XMLParser中的一個以上的對象。

現在上面的代碼語句會正確給我一個未經檢查的類型轉換警告。因爲我無法正確配置XMLParser爲通用的。

這裏就是麻煩的是發生

public class XMLParser<T> { 

private static XMLParser reference=null; 
String rootNode; 
String requiredNode; 
List<String> members; 
Class<T> targetClass; 


private XMLParser() 
{ 

} 

public static XMLParser getInstance() 
{ 
    if(reference==null) 
     reference= new XMLParser(); // i think I need new XMLParser<T>() here , but how can I transport T here ? 
    return reference; 
} 

正如你看到它是一個基本的單。我不能做到以下幾點

List<Student> stdent= XMLParser.getInstance<Student.class>().parse(etc etc)

我特別丟失,你可能會注意到。

我該怎麼辦?我剛剛研究並發現靜態變量不能使用類的類型參數。這是我需要的靜態變量「參考」。那麼隧道盡頭沒有燈光?

謝謝。

+1

有一個通用的單身人士是一個壞主意,更糟糕的是,如果你使用它作爲原始類型。順便說一句,你可以有一個初始化方法,這個XML解析器是方法的局部變量,因此完全避免了單例。 –

+0

可能是一個can或蠕蟲,但是如何處理一個XMLParserFactory,它包含一個實例化的XMLParsers的集合?然後XMLParserFactory.getInstance(class).parse(etc等); –

+2

爲什麼不簡單地使XMLParser.parse通用?我不明白爲什麼你需要你的單例是通用的。例如:public List parse(類 T,...) –

回答

0

你可以嘗試這樣的事情:

public static <U> XMLParser<U> getInstance() 
{ 
    if(reference==null) 
     reference = new XMLParser<U>(); 
    return (XMLParser<U>)reference; 
} 

,並調用它像:

XMLParser<Student> parser = XMLParser.<Student>getInstance(); 

甚至直接這樣:

XMLParser<Student> parser = XMLParser.getInstance(); 

但是,正如上述評論,這不是一個好主意。

+0

感謝florent。確實每個人都是對的。這是一個錯誤的想法。如果單例的目的是在整個應用程序中有一種類型的對象,那麼我有一個有缺陷的需求,或許我打算改變這個類的參數類型。 –