1

我有这样的课:

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方法,所以我不需要在我的所有类中保留这个代码?我尝试使用泛型,但没有运气。也许有一个我试图实现的例子?

4

1 回答 1

0

这样做的一种方法是从Class您要实例化的对象和您正在使用的单例实例中保存一个映射。假设您的所有类都有一个来自 a 的公共构造函数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;
    }
}
于 2015-08-02T08:14:18.610 回答