Ранее я использовала Singleton наподобие этого: public class Singleton { private static Singleton instance private Singleton (){ } public static Singleton getInstance(){ if (null == instance){ instance = new Singleton() } return instance } } Ранее я видела много примеров использования такого класса в андроид-приложениях и различных справочниках. Но наткнулась на статью, в которой был описан недостаток использования такого Singleton в Android: Мы создаем экземпляр класса Singleton в контексте текущей Activity и если эта Activity завершает свою работу, то и экземпляр класса будет уничтожен (причем не сразу, а когда сработает сборщик мусора Java). А значит при следующем вызове getInstance() объект будет создаваться заново (вновь вызовется конструктор). Если в классе Singleton мы храним какие-то статичные переменные или методы, то это можно просто проигнорировать. Вот ссылка на статью Далее в этой статье говорится, что, чтобы избежать такой ошибки, нужно инициализировать синглтон в подклассе класса Application: public class MyApp extends Application { @Override public void onCreate() { super.onCreate() Log.w("MY", "onCreate MyApp") MySingleton.initInstance() } } И сам синглтон: class MySingleton { ... public static void initInstance() { Log.d("MY", "MySingleton::InitInstance()") if (mInstance == null) { mInstance = new MySingleton() } } public static MySingleton getInstance() { Log.d("MY", "MySingleton::getInstance()") return mInstance } ... } теперь вне зависимости от того какие activities работают экземпляр класса MySingleton будет существовать. То есть, это более правильный вариант использования Singleton в Android? Нет ли у этого способа каких-либо недостатков? Хотелось бы узнать вашу точку зрения.
Ответ В случае использования паттерна Singleton при разработке для Android важно помнить две вещи: Никогда не сохранять в синглтоне ссылку на активити. Если для работы синглтона нужен контекст, используйте контекст приложения. Иначе будут утечки памяти. Всегда лучше создать приватную переменную в потомке класса Application со ссылкой на экземпляр вместо приватной статической в самом классе сиглтона, если это возможно. Следуя этим двум простым правилам будет сложнее "выстрелить себе в ногу" :)