Reputation: 1742
I don't know Java very well, so would like to ask if this implementation is OK. (Thread-safety doesn't matter). I want a single unique singleton for every T class possible.
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;
}
}
Upvotes: 0
Views: 93
Reputation: 533520
A simple solution which is also thread safe is to use 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 will return the same value object for any class and is thread safe.
Note: ClassValue cleans itself up when a Class is no longer referenced.
Upvotes: 1
Reputation: 1331
if (singleton == null) {
singleton = new MockDatabase<T>();
}
Change above code to
if (singleton == null) {
singleton = new MockDatabase<T>();
singletonHolder.put(clazz.getName(),singleton );
}
Other wise you will get new object every time
Upvotes: 1