Является ли хорошей практикой хранение хранилища объектов в пользовательском классе приложения

#java #android #performance

#java #Android #Производительность

Вопрос:

Я хочу использовать объект во многих местах моего приложения: фрагменты, действия, даже в службах.

Есть ли лучший способ сделать это, чем то, как я сделал это ниже?

Я также хочу знать, есть ли какие-либо другие хорошие практики.

Лучше ли сделать объект статическим или не статичным?

Всегда ли класс приложения хранит объект, когда я вызываю его из каких-либо действий или фоновых служб?

 public class MyApplication extends Application {
   private static DaoMaster.DevOpenHelper dao;

   @Override
   public void onCreate() {
      super.onCreate();
      dao = new DaoMaster.DevOpenHelper(this,
            getString(R.string.db_name), null);
   }

   public static DaoMaster.DevOpenHelper getDao() {
      return dao;
   }

   public static void setDao(DaoMaster.DevOpenHelper dao) {
      MyApplication.dao = dao;
   }
}
 

Ответ №1:

Мне не нравятся статические поля и методы. Я думаю, что это неправильно для парадигмы ООП. Вы можете столкнуться с множеством проблем, связанных с многопоточным доступом к вашей базе данных.

В вашем случае вы можете хранить объект как нестатическое поле и получать к нему доступ из activity или service следующим образом:

 ((MyApplication) getApplication()).getDao()
 

Для случая, подобного вашему, вы можете использовать внедрение зависимостей. Для этого на Android есть хорошая библиотека (Dagger от squareUp). С его помощью вы можете легко «внедрить» свой объект во многие места.

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

1. хорошо, спасибо за вашу помощь, я действительно не понимал внедрение зависимостей

2. ((MyApplication) getApplication()).getDao() создает ли это проблему, когда я вызываю его из службы, которая просматривает службы сигнализации или любое другое место, отличное от Activity

3. @saleeh93 Я предлагаю вам попробовать. Но будьте осторожны, потому что dagger хорош для Android, а RoboJuice — нет. Плохая идея использовать библиотеку DI, которая использует отражение. Кинжал — это DI времени компиляции, а не время выполнения.

4. @saleeh93 он должен работать в режиме обслуживания и активности. В других местах вы должны получить доступ к объекту действия, а затем получить доступ к объекту действия выброса приложения. DI решит эту проблему.

5. Спасибо за вашу помощь, я попробую