Java 泛型、单例和静态方法

标签 java generics inheritance static singleton

所以我有一些“管理器”类,例如 GroupManager。所有这些经理都是单例。

使用此方法进行实例化:

private static GroupManager groupManager = null;

private GroupManager()
{

}

public static GroupManager Instance()
{
    if (groupManager == null)
    {
        groupManager = new GroupManager();
    }
    return groupManager;
}

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

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

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

GroupManager extends Manager

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

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

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

}

我认为这是有道理的:)

那么您将像往常一样执行 GroupManager.Instance()。

最佳答案

您不了解泛型和静态是如何工作的。如果您有一个静态字段或方法(例如“instance”或 instance()),可以在不实例化类管理器的情况下调用它们,您如何期望 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;
            }
        }
    }

关于Java 泛型、单例和静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7982129/

相关文章:

java - 读取(日志)文件而不锁定其他进程的重命名/移动

java泛型类型删除

inheritance - 对象表达式和错误 FS0419 : 'base' values may only be used to make direct calls to the base implementations of overridden members

objective-c - 在 Objective-c 中继承实例变量

C++ 类继承和模板

java - 幽灵异常 : Java exceptions on empty lines

java - Hibernate : Why FetchType. LAZY-annotated 集合属性急切加载?

java - REST GET 设计问题

c# - 如何获取 Dictionary<T, S> 中键的 ReadOnlyCollection<T>

java - OpenImaj 库中 BagOfVisualWord 类的使用