Во-первых, я должен признать, что моя проблема похожа на Синглтон с аргументами в 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;
}
}
Это делает вопрос понятнее?