繁体   English   中英

java工厂方法和泛型

[英]java factory methods and generics

今天,我一直在清理我的一些代码,其中涉及创建多个工厂类,以便根据用户输入即时创建不同的类。 我发现它们都遵循几乎相同的模式:

public class MyClassFactory{
    private static MyClassFactory singleton = new MyClassFactory();
    public static MyClassFactory getInstance(){return singleton;}
    private MyClassFactory();
    private HashMap<String, Class<? extends MyClass>> instances = new HashMap<>();

    public void register(String name, Class<? extends MyClass> clazz){
        instances.put(name, clazz);
    }

    public MyClass getByName(String name) throw ...{
        return instances.get(name).newInstance();
    }
}

我的问题是,我不应该为此创建超类,我可以在其中将类类型作为泛型传递。 像这样:

public class SimpleFactory T<Class>{
    private HashMap<String, Class<T>> instances = new HashMap<>();

    public void register(String name, Class<? extends T> clazz){
        instances.put(name, clazz);
    }
    //or possibly public <T> T getByName....
    public T getByName(String name) throw ...{
        return instances.get(name).newInstance();
    }
}

public class MyClassFactory extends SimpleFactory<MyClass.class>{
    private static MyClassFactory singleton = new MyClassFactory();
    public static MyClassFactory getInstance(){return singleton;}
    private MyClassFactory();
}

不幸的是,我在整个MyClassFactory类上都遇到了编译错误,这似乎是MyClass.class导致的,并且表示“参数数量错误,需要1”。

这可能/值得吗?

首先,您在SimpleFactory类声明的开头行有一个错字。 我认为您正在寻找类似的东西

public class SimpleFactory<T> {

然后子类将是

public class MyClassFactory extends SimpleFactory<MyClass> {

考虑使基类抽象。

顺便说一句,如果您的应用程序在很大程度上依赖单例并且完全没有任何复杂性,或者复杂性将继续增长,请考虑使用像Spring或Guice这样的IOC容器。 我个人是Spring的忠实粉丝。 有些人抱怨它的复杂性,但是它包含在模块中,您不必使用所有东西。 我的两分钱。

您在这里的语法非常错误。 我不是100%知道您要做什么,但是以下方法可以正常工作:

public class SimpleFactory<T> {
    private HashMap<String, Class<? extends T>> instances = new HashMap<>();

    public void register(String name, Class<? extends T> clazz){
        instances.put(name, clazz);
    }
    //or possibly public <T> T getByName....
    public T getByName(String name) throws ... {
        return instances.get(name).newInstance();
    }
}

public class MyClassFactory extends SimpleFactory<MyClass> { ... }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM