Должна ли моя модель в Android быть синглтоном? - PullRequest
0 голосов
/ 15 января 2019

Мне кажется, что если у вас есть состояние или данные в Android, к которым вы хотите получить доступ из различных действий (но не хотите продолжать), вам нужен синглтон. Это правильно или есть другие способы разработки приложения?

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

1 Ответ

0 голосов
/ 15 января 2019

То, что вы сказали, определенно неверно, и существуют другие способы разработки приложения для Android.

На самом деле, для разработки под Android, Singletons следует избегать или использовать с осторожностью, и следует использовать not в качестве первого или единственного решения. Особенно его не следует использовать для небрежного обмена данными или состоянием между действиями.

Если вы обнаружите, что ваше приложение требует использования Singletons для всего, то есть вероятность ... что вам нужно изменить дизайн своего приложения.

При использовании Singletons необходимо помнить несколько вещей:

  • Обычно они живут в течение всего жизненного цикла приложения, пока они не будут закрыты системой, закрывающей ваше приложение

  • Неправильно созданные синглтоны могут легко утечь память

  • Неправильно спроектированные синглтоны и чрезмерное использование синглетонов могут израсходовать много ненужной памяти

  • Их сложно использовать для тестирования

В целом, при использовании Singletons вам действительно нужно подумать о том, достаточно ли для этой части вашего приложения быть Singleton.

В большинстве случаев ответ - нет. В упомянутых вами случаях, таких как доступ к состоянию или данным между действиями, это да и нет.

Это да, потому что необходимость доступа к данным может оправдать использование Singleton. Это не потому, что необходимость доступа к состоянию приложения не должна.

Использование вами слова «состояние» совершенно неясно, но действия должны быть действительно самоуправляемыми, поскольку состояние действия не должно мешать состоянию другого действия. Если это так, то есть более эффективные способы отправки этой информации в действие (, например, с помощью дополнений Intent ), вместо создания Singleton, который доступен для всего и существует дольше, чем следовало бы.

На самом деле очень мало причин, чтобы оправдать потребность в Синглтоне.

По моему опыту, есть только две причины, по которым можно использовать Singleton:

  • Реальная потребность в существовании одного экземпляра
  • Singleton используется очень часто, и постоянно создавать его дорого, но не будет каких-либо серьезных побочных эффектов, чтобы сохранить его в памяти.

Например, база данных SQLite обычно используется в качестве Singleton, поскольку один синхронизированный экземпляр базы данных может помочь предотвратить чтение / запись в базу данных более чем одним действием или службой. Это помогает предотвратить ситуации, такие как один объект записывает новые данные, в то время как другой объект читает старые данные перед записью новых данных. Или простая ситуация, когда два объекта записывают разные данные в одно и то же поле одновременно.

Кроме того, приложения часто обращаются к базе данных SQLite, поэтому бессмысленно постоянно открывать базу данных, извлекать некоторые данные, закрывать базу данных, открывать базу данных, записывать некоторые данные, закрывать базу данных, и повтори.

Я видел, как разработчики используют Singletons во многих ситуациях, и большинство из них по очень плохим причинам.

Добро:

  • Базы данных
  • SharedPreferences (приложение должно получать доступ к предпочтениям чаще, чем обычно)
  • Система регистрации

Плохое:

  • Я видел, как разработчик загружал большое количество Drawables и сохранял их в Singleton при запуске своего приложения ... просто, чтобы он мог быстро использовать эти drawables везде.
  • Я видел, как некоторые разработчики использовали Singletons для хранения списка созданных действий, чтобы они могли получить доступ к этим методам и представлениям действий ... ( dead )

Я видел больше плохих историй, но я не могу вспомнить их сейчас.

Кроме того, имейте в виду, что, хотя я и говорил, что такие вещи, как базы данных, являются хорошей идеей для использования в качестве синглтона, я лишь имел в виду, что он требует использования синглтона. База данных не должна быть одиночной, и есть другие доступные решения, которые могли бы лучше соответствовать вашему приложению.

Так что всегда думайте о том, нужно ли вам использовать Singleton.

В вашем случае, действительно ли необходимо, чтобы состояние / данные, к которым вам нужно получить доступ другими действиями, оставались в живых в течение всего времени работы приложения, и можно ли их решить с помощью таких решений, как: SharedPreferences, Дополнительные функции Intent, Интерфейсы обратного вызова, Базы данных, статические классы / поля / методы и т. д.

Если вы хорошо продумали свое приложение и действительно думаете, что Singleton принесет пользу вашему приложению, тогда используйте его. Не забудьте использовать контекст приложения вместо контекста действия, потому что синглтон определенно переживет вашу активность, и вам не нужны проблемы утечки памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...