EralpB
EralpB

Reputation: 1742

One Singleton for each (generic) type

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

Answers (2)

Peter Lawrey
Peter Lawrey

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

mahesh
mahesh

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

Related Questions