使用Java

时间:2015-08-02 07:27:09

标签: java singleton double-checked-locking

我有一个类似的课程:

public class Contact {

    private static volatile Contact instance;

    private List<Item> contacts = new ArrayList<>();
    private Context context;

    public static Contact getInstance(Context context) {
        Contact localInstance = instance;
        if (localInstance == null) {
            synchronized (Contact.class) {
                localInstance = instance;
                if (localInstance == null) {
                    instance = localInstance = new Contact(context);
                }
            }
        }
        return localInstance;
    }

    public Contact(BaseAuthActivity context) {
        this.context = context;
        update();
    }

在这里,我创建了一个类的实例,在class属性上进行同步。

我的项目中有很多这样的课程。有没有办法创建一个基类,它将实现getInstance方法,所以我不需要在我的所有类中保留这些代码?我尝试使用泛型,但没有运气。也许有一个我试图实现的例子?

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是从要实例化的Class对象和您正在使用的单例实例中保存地图。假设您的所有类都有Context的公共构造函数,您可以使用反射来调用它:

public class Contact {

    private static ConcurrentMap<Class<? extends Contact>, Contact> instances = 
        new ConcurrentHashMap<>();

    public static <T extends Contact> T getInstance
        (Context context, Class<T> clazz) {

        T instance = (T) instances.get(clazz);
        if (instance == null) {
            synchronized (clazz) {
                instance = (T) instances.get(clazz);
                if (instance == null) {
                    try {
                        Constructor<T> constructor = 
                            clazz.getConstructor(Context.class);
                        return constructor.newInstance(constructor);
                    } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
                        // log
                        return null;
                    }
                }
            }
        }
        return instance;
    }
}