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