Синглтон с аргументами в Java снова - PullRequest
1 голос
/ 02 февраля 2012

Во-первых, я должен признать, что моя проблема похожа на Синглтон с аргументами в Java

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

Вот моя проблема.Я создаю «синглтонный» класс для предоставления некоторой общей функции, например, для получения глобального параметра конфигурации.Этому классу нужен обработчик для доступа к системным ресурсам, например, для чтения файла конфигурации.Потому что этот класс просто действует как библиотека, обработчик должен передавать извне, а обработчик является системным классом.

Итак, я пишу свой код следующим образом:

public class SingletonGlobalParameters {
    private static final SingletonGlobalParameters instance = new SingletonGlobalParameters ();

    private boolean initial = false;

    private String aParameter = null;

    private SingletonGlobalParameters () { }

    public static SingletonGlobalParameters getInstance() {
            if (initial == false) {
                throw exception...
            }
            return instance;
    }

    public void init(Handler h) {
        if (initial == false) {
            Handler fileHandler = h;
            aParameter = fileHandler.read(); // something like this
            initial = true;
        }
    }

    public int getParameter() {
        return aParameter;
    }
}

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

Есть хорошие идеи?Большое спасибо, эта проблема беспокоила меня уже некоторое время.


ОК!Я даю реальную проблему мира.Это проблема Android.

public class Configuration {
    private static final Configuration instance = new Configuration ();

    private boolean initial = false;

    private long timeStamp = -1;

    private Configuration () { }

    public static Configuration getInstance() {
            if (initial == false) {
                throw exception...
            }
            return instance;
    }

    public void load(Context context) {
        if (initial == false) {
            SharedPreferences loader = context.getSharedPreferences("Conf", Context.MODE_PRIVATE);
            timeStamp = loader.getInt("TimeStamp", 0);              
            initial = true;
        }
    }

    public int getTimeStamp() {
        return timeStamp;
    }
}

Это делает вопрос понятнее?

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

Правильный шаблон - это тот, который позволяет вам делать то, что вам нужно. Не будь таким догматичным. Синглтон с параметром широко используется и поддерживается в среде Android (обычно это контекст). Но в простой среде Java внедрение зависимостей было бы лучше, так как Разъединяет код, используя ваш синглтон, от того, что он является синглтоном, и модальностей его создания. Существует множество DI-фреймворков, таких как picocontainer, spring, Google Guice - просто выберите свой любимый

1 голос
/ 02 февраля 2012

РЕДАКТИРОВАТЬ: Когда я написал этот ответ, вопрос не имел никакого контекста - мы не знали, что это приложение для Android. может быть в том, что это не плохое решение в этом случае; но я бы хотя бы подумал о других подходах. Я оставляю свой ответ ниже для более общего случая.

Я бы попытался отойти от шаблона синглтона, чтобы начать с.

Почему каждый параметр конфигурации необходим во многих местах? Не могли бы вы инкапсулировать каждый аспект конфигурации (возможно, несколько параметров в одном аспекте в некоторых случаях) и затем использовать внедрение зависимостей (например, с Guice), чтобы сделать эти инкапсулированные версии доступными для компонентов, которым они нужны?

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

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