Страницы

Поиск по вопросам

вторник, 2 октября 2018 г.

Singleton в Android - зло?

Ранее я использовала 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 со ссылкой на экземпляр вместо приватной статической в самом классе сиглтона, если это возможно.
Следуя этим двум простым правилам будет сложнее "выстрелить себе в ногу" :)

Комментариев нет:

Отправить комментарий