Java泛型,单例和静态方法

Met*_*orm 7 java generics inheritance singleton static

所以我有一些'经理'类,例如GroupManager.所有这些经理都是单身人士.

使用此方法进行实例化:

private static GroupManager groupManager = null;

private GroupManager()
{

}

public static GroupManager Instance()
{
    if (groupManager == null)
    {
        groupManager = new GroupManager();
    }
    return groupManager;
}
Run Code Online (Sandbox Code Playgroud)

我想我应该开始使用一些继承,因为他们有很多复制的方法.

每个Manager的Instance()方法都是相同的.

所以对于继承我可以这样做(显然):

GroupManager extends Manager
Run Code Online (Sandbox Code Playgroud)

是否可以使用泛型对所有管理器使用相同的Instance方法,例如:

public class Manager<E>
{
    private static E instance = null;

    public static E Instance()
    {
        if (instance == null)
        {
            instance = new E();
        }
        return instance;
    }

}
Run Code Online (Sandbox Code Playgroud)

我认为这是有道理的:)

那么你就像普通的那样做GroupManager.Instance().

Shi*_*gon 9

你不明白泛型和静态是如何工作的.如果您有一个静态字段或方法(例如"instance"或instance()),可以在不实例化类Manager的情况下调用它,那么您希望JVM(以及编译器甚至)知道E应该是什么类型是?

根据G_H的建议,这是一个例子:

GeneralManager和AreaManager都扩展了Manager

Manager类是唯一具有getInstance()静态方法的类:

    public class Manager {

        private static Map<Class<? extends Manager>,Manager> INSTANCES_MAP = new java.util.HashMap<Class<? extends Manager>, Manager>();

//Also, you will want to make this method synchronized if your application is multithreaded,
//otherwise you mihgt have a race condition in which multiple threads will trick it into
//creating multiple instances
        public static <E extends Manager> E getInstance(Class<E> instanceClass) throws InstantiationException, IllegalAccessException {
            if(INSTANCES_MAP.containsKey(instanceClass)) {
                return (E) INSTANCES_MAP.get(instanceClass);
            } else {
                E instance = instanceClass.newInstance();
                INSTANCES_MAP.put(instanceClass, instance);
                return instance;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)