Безопасен ли класс "Globals", содержащий статические переменные в Android? - PullRequest
14 голосов
/ 12 октября 2011

Может ли кто-нибудь рассказать мне о безопасности класса с глобальными ценностями в Android?

Вот краткий пример того, что я имею в виду:

public class Globals {
    public static int someVariable = 0;
    public static User currentUser = null;
    public static Handler onLogin = null;
}

Затем где-то в Activity я делаю следующее:

Globals.someVariable = 42;
Globals.currentUser = new User("John", "Doe");

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

Я везде читал, что Android-приложение может быть убито в любое время. Значит ли это, что оно полностью или частично или полностью уничтожено, и, таким образом, убивает только мой класс Globals?

Или есть какой-либо другой способ безопасного хранения глобально доступных данных, без записи каждого изменения члена в базу данных (фактически мой класс User на немного более сложный, чем в этом пример.; -)

Спасибо за ваши усилия!


Редактировать: Хорошо, вот что я наконец-то сделал:

public class MyApp extends Application {

    private static MyApp _instance;

    public MyApp() {
        super();
        _instance = this;
    }

    public static MyApp getContext() {
        return _instance;
    }
    ....
    private User _user = null;
    public User getUser() {
        if (_user == null) _user = new User();
        return _user;
    }
}

Затем измените AndroidManifest.xml и добавьте android:name=".MyApp" к вашему узлу application, чтобы сообщить приложению использовать ваш подкласс.

Пока все работает нормально, и я легко могу получить доступ к текущему Context (например, в SQLiteOpenHelper), позвонив по номеру MyApp.getContext().

Ответы [ 2 ]

8 голосов
/ 12 октября 2011

Было бы лучше использовать класс Android Application. Он предназначен для хранения глобального состояния приложения

http://developer.android.com/reference/android/app/Application.html

Просто создайте подкласс и обязательно обновите файл манифеста, чтобы использовать вашу версию. Тогда вы можете хранить все, что вам нужно в нем. У действий есть метод getApplication(), который вы можете привести к своему классу для доступа к своей реализации

1 голос
/ 12 октября 2011

Шаблон не рекомендуется - у вас возникнут проблемы при модульном тестировании.

Можете ли вы объяснить, как вы проводите модульное тестирование класса, который должен предоставлять различные пользовательские "Пользователи" здесь? Вы либо принудительно вводите класс mock / fake в «User», который, вероятно, будет иметь перекрестный эффект для других тестов, либо вставляете if (test) в свой код, который становится ужасно быстрым.

Со временем искусственное заполнение этого класса для тестирования становится все более сложным и начинает иметь отношения и зависимости.

Проще говоря, это затрудняет модульное тестирование класса в отдельности.

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

...