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

09-30 20:27