Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的通用单例问题_Java_Generics - Fatal编程技术网

Java中的通用单例问题

Java中的通用单例问题,java,generics,Java,Generics,我想要通用单例的原因如下 我有一个XMLParser类,它包含解析给定xml的方法,并为该xml提供POJO List<Student> studentList = XMLParser.getInstance().parse(Student.class, xml , String args[]); List studentList=XMLParser.getInstance().parse(Student.class,xml,字符串args[]); 现在将XMLParser类设置

我想要通用单例的原因如下

我有一个XMLParser类,它包含解析给定xml的方法,并为该xml提供POJO

List<Student> studentList = XMLParser.getInstance().parse(Student.class, xml , String args[]);
List studentList=XMLParser.getInstance().parse(Student.class,xml,字符串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;
}
公共类XMLParser{
私有静态XMLParser引用=null;
字符串根节点;
需要字符串的节点;
成员名单;
类targetClass;
私有XMLParser()
{
}
公共静态XMLParser getInstance()
{
if(reference==null)
reference=new XMLParser();//我想这里需要一个新的XMLParser(),但我如何在这里传输T呢?
返回参考;
}
正如你所看到的,这是一个基本的单身汉

List stdent=XMLParser.getInstance().parse(etc)

你可能会注意到,我特别迷路

我该怎么办?我刚刚研究发现静态变量不能使用类的类型参数。这就是我需要静态变量“reference”的原因。那么,在这条隧道的尽头没有灯了吗


谢谢。

你可以试试这样的东西:

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();
publicstaticxmlparser getInstance()
{
if(reference==null)
reference=newxmlparser();
返回(XMLParser)引用;
}
这样称呼它:

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();
XMLParser=XMLParser.getInstance();
或者直接这样说:

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();
XMLParser=XMLParser.getInstance();

但是,正如评论中所说,这样做并不是一个好主意。

拥有一个通用的单例是一个坏主意,如果您将其用作原始类型,甚至更糟。顺便说一下,您可以拥有一个初始化器方法,其中XML解析器是该方法的局部变量,从而完全避免了单例。可能是一个can或蠕虫,但XMLPAR呢erFactory包含实例化的XMLParser集合?然后是XMLParserFactory.getInstance(class).parse(等等);为什么不简单地将XMLParser.parse设置为泛型?我不明白为什么需要将单例设置为泛型。类似于:公共列表解析(class t,…)如果您需要一个XMLParser和一个XMLParser怎么办?您的实现只允许一个,不管是泛型的。我甚至不确定您是否希望XMLParser是单例的。您是否将其编程为线程安全的?如果您希望并行解析多个Student.xml-s怎么办?根据我看到的代码,在调用parse方法之前,您应该创建一个新的insta感谢florent。事实上,每个人都是对的。这是一个错误的想法。如果单例的目的是在整个应用程序中使用一种类型的对象,那么我有一个有缺陷的需求,可能是我打算更改类的参数类型。