Является ли Singleton лучшим способом сохранить данные в памяти приложения Android?
Я создаю приложение для Android с классом User, который используется для хранения информации профиля пользователя.
Когда пользователь создан, он сохраняется в файле SharedPreferences, поэтому я могу загрузить последнего созданного пользователя, а затем при следующем запуске приложения. У меня также есть класс Singleton, который содержит объект только что созданного пользователя, поэтому он может использоваться другими классами.
Я сделал это, чтобы избежать чтения файла SharedPreferences каждый раз, когда я изменяю Фрагмент и требуется пользователь.
Мой вопрос:
Является ли использование Singleton правильным способом хранения переменных в памяти для всего приложения?
Было ли это предназначено для этого или есть другой способ сделать это, сохраняя принципы объектно-ориентированного программирования?
Было бы лучше создать переменные в Activity вместо методов доступа?
2 ответа
Я бы использовал следующее: Интерфейс CurrentUser. CurrentUser имеет методы для извлечения и обновления пользователя. Пользователь может храниться в БД, настройках или в смешанном виде. Я бы использовал Dagger, чтобы вводить CurrentUser при необходимости. Реализация CurrentUser сама по себе должна быть одноэлементной, поскольку Dagger не гарантирует качества одноэлементного. Бонусные баллы, если у вашего CurrentUser есть что-то вроде потока RxJava или LiveData, чтобы держать наблюдателей в курсе.
В качестве альтернативы синглтону вы можете захотеть реализовать паттерн Fragment Holder с сохраненными фрагментами, но в вашей ситуации Singleton выглядит лучше. Просто убедитесь, что вы используете интерфейсы и внедрение, чтобы не поставить под угрозу тестируемость и держать ваши компоненты разделенными.
Да, это лучший способ сделать это. И лучше хранить данные (как вы упомянули случай) в объекте Singleton, а доступ к ним всегда из общих предпочтений. Мы используем синглтон для целей сеанса в приложении, это означает, что, пока приложение выполняет переменные, данные будут доступны. Вы можете создавать переменные на уровне активности, но это был бы очень плохой подход. Короче говоря, подход, который вы используете для своих целей, является лучшим.