2014-01-07 3 views
-1

У меня есть класс, который реализует шаблон 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() выполняются в основном потоке.

+4

Откуда вы знаете, это разные? –

+0

, потому что я вижу из отладчика, что он проходит два раза из инструкции создания (instance = new Singleton();) и из-за других соображений. Я уверен, что он создает экземпляр singleton два раза. – Massimo

+2

Если вы не испортили загрузчики классов, это может быть только проблема безопасности потоков ... – assylias

ответ

0

Первый, ваш код даже не компилировать

map.put(k,v); // not add 

Второй, я добавил println() в конструкторе

private HashMap<String, String> map; 
private Singleton() { 
    System.out.println("Singleton Constructor"); 
    map = new HashMap<String, String>(); 
} 

Третий, я проверил это -

public static void main(String[] args) { 
    Singleton one = Singleton.getInstance(); 
    Singleton two = Singleton.getInstance(); 
    if (one == two) { 
     System.out.println("One instance"); 
    } 
} 

Результаты были

Singleton Constructor 
One instance 

Пожалуйста, ваши фактический код, если вы посудить об ошибке (потому что ваш код здесь явно неправильно).

+0

Я сказал, что нет проблем, если я вызову метод getInstance два или более раза внутри действия. Проблема заключается в том, когда я вызываю getInstance в первый раз на фрагменте после того, как я назвал его один или несколько раз внутри действия. – Massimo

0

Как вы говорите, ваш код не является потокобезопасным. Если Singleton не стоит создавать экземпляр, а затем просто инициализируйте его.

class Singleton { 
    private static Singleton instance = new Singleton(); 
Смежные вопросы