每种(通用)类型一个单身人士

时间:2017-02-06 13:52:00

标签: java singleton

我不太了解Java,所以想问一下这个实现是否正常。 (线程安全并不重要)。我希望每个T类都有一个独特的单例。

public class MockDatabase<T> {
    private MockDatabase() {}

    private static Map<String, MockDatabase> singletonHolder = new HashMap<String, MockDatabase>();

    public static <T> MockDatabase<T> getInstance(Class<T> clazz) throws InstantiationException, IllegalAccessException {
        MockDatabase<T> singleton = (MockDatabase<T>)singletonHolder.get(clazz.getName());
        if (singleton == null) {
            singleton = new MockDatabase<T>();
            singletonHolder.put(clazz.getName(), singleton);
        }

        return singleton;
    }
}

2 个答案:

答案 0 :(得分:1)

if (singleton == null) {
        singleton = new MockDatabase<T>();
 }

将上述代码更改为

if (singleton == null) {
       singleton = new MockDatabase<T>();
       singletonHolder.put(clazz.getName(),singleton ); 
}

另外,你每次都会得到新的物品

答案 1 :(得分:1)

一个也是线程安全的简单解决方案是使用ClassValue

public class MockDatabase<T> {
    private static final ClassValue<MockDatabase> cache = new ClassValue<>() {
         protected MockDatabase computerValue(Class<?> clazz) {
             return new MockDatabase();
         }
    }
    public static <T> MockDatabase<T> getInstance(Class<T> clazz) {
        return (MockDatabase<T>) cache.get(clazz);
    }
}

ClassValue将为任何类返回相同的值对象,并且是线程安全的。

注意:当不再引用Class时,ClassValue会自行清理。