我不太了解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;
}
}
答案 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会自行清理。