Оболочка Singleton для Context - PullRequest
3 голосов
/ 03 мая 2010

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

Я планировал разместить в этом синглтоне ссылку на Context, возвращаемую Application.getApplicationContext(). Этот одноэлементный объект будет инициализирован в моем пользовательском Application экземпляре, прежде чем что-либо еще потребуется или будет иметь возможность его использовать.

Может кто-нибудь придумать причину, чтобы не сделал это?

Ответы [ 3 ]

2 голосов
/ 04 мая 2010

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

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

  • Как синглтоны ограничивают вашу способность надлежащим образом юнит-тестировать ваше приложение.
  • Синглтоны скрывают зависимости между различными объектами в коде - вы не можете определить зависимости при проверке интерфейсов.
  • У вас нет реального контроля над временем жизни синглтона, оно может существовать на протяжении всего времени жизни вашего приложения. Вы действительно хотите потенциально поддерживать соединение с БД в течение всего срока службы вашего приложения?
  • Потокобезопасность вашего синглтона.

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

0 голосов
/ 04 мая 2010

Вставлено сюда, чтобы сохранить форматирование.

public class ContextContainer
{
    private static boolean initialized;
    private static Context context;

    private ContextContainer()
    {
        //
    }

    public static synchronized void setApplicationContext(Context context)
    {
        if (!initialized) {
            ContextContainer.context = context;
            initialized = true;
        } else {
            throw new RuntimeException("ApplicationContext has already been set!");
        }
    }

    public static synchronized Context getApplicationContext()
    {
        return context;
    }
}
0 голосов
/ 04 мая 2010

Я не уверен, что понял вашу идею, но вот что работает для меня:

public class MyApp extends Application {

private static MyApp instance;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
        // ...
    }

    public static MyApp getInstance(){
        return instance;
    }

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