我不太了解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;
}
}
最佳答案
一个简单的也是线程安全的解决方案是使用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会自行清理。