У меня есть класс, который реализует шаблон Singleton. Мне нужен экземпляр этого класса в Activity и в фрагменте (размещенном по активности).Несколько экземпляров одноэлементного класса ... очень странное поведение
Странно то, что, также, если деятельность является первой, чтобы создать экземпляр класса одноплодного, когда я пытаюсь получить этот экземпляр из фрагмента он создает еще один экземпляр ...
Ниже приводится код одноэлементного класса:
public class NotificationCenter {
private NotificationCenter() {
}
// useless for this question
private class MyObservable extends Observable {
@Override
protected void setChanged() {
super.setChanged();
}
}
// useless for this question
private class MyObserver implements Observer {
String name;
Notificable notificable;
public MyObserver(String name, Notificable notificable) {
this.name = name;
this.notificable = notificable;
}
@Override
public void update(Observable observable, Object data) {
notificable.notificationReceived(name, data);
}
}
private static NotificationCenter defaultCenter = null;
private HashMap<String, MyObservable> observables;
public static synchronized NotificationCenter defaultCenter() {
if (defaultCenter==null) {
defaultCenter = new NotificationCenter();
defaultCenter.observables = new HashMap<String, MyObservable>();
}
return defaultCenter;
}
public void addObserver(String notification, Notificable notificable) {
MyObservable observable = observables.get(notification);
if (observable==null) {
observable = new MyObservable();
observables.put(notification, observable);
}
MyObserver observer = new MyObserver(notification, notificable);
observable.addObserver(observer);
}
public void removeObserver(String notification, Observer observer) {
MyObservable observable = observables.get(notification);
if (observable!=null) {
observable.deleteObserver(observer);
}
}
public void postNotification(String notification, final Object object) {
final MyObservable observable = observables.get(notification);
if (observable!=null) {
observable.setChanged();
observable.notifyObservers(object);
}
}
}
Должен ли я рассмотреть то, что у меня нет? Все вызовы метода defaultCenter() выполняются в основном потоке.
Откуда вы знаете, это разные? –
, потому что я вижу из отладчика, что он проходит два раза из инструкции создания (instance = new Singleton();) и из-за других соображений. Я уверен, что он создает экземпляр singleton два раза. – Massimo
Если вы не испортили загрузчики классов, это может быть только проблема безопасности потоков ... – assylias