Я использую Gson для десериализации Json в модель ApplicationModel
. Я хочу, чтобы эта модель была одиночной, поэтому я могу получить доступ к ней в другом месте приложения.Использование Gson для десериализации Json в singleton
Теперь, когда Gson создает экземпляр этого класса, я создаю экземпляр singleton довольно нетрадиционным способом. Смотрите ниже:
public class ApplicationModel {
private static ApplicationModel instance;
private GeneralVO general;
protected ApplicationModel() {
instance = this;
}
public static ApplicationModel getInstance() {
return instance;
}
public String getVersionDate() {
return general.getVersionDate();
}
}
Это способ создать его, а затем использовать его позже в применении:
InputStreamReader reader = new InputStreamReader(is);
ApplicationModel model1 = new Gson().fromJson(reader,ApplicationModel.class);
Log.i("MYTAG", "InputStream1 = "+model1.toString());
Log.i("MYTAG", "Date: "+model1.getVersionDate());
ApplicationModel model2 = ApplicationModel.getInstance();
Log.i("MYTAG", "InputStream1 = "+model2.toString());
Log.i("MYTAG", "Date: "+model2.getVersionDate());
Это работает как getInstance()
возвращает ту же модель, но так или иначе это просто не кажется правильно.
Мой вопрос: «Это хороший способ обойти это или есть лучшее решение?»
EDIT
Намного лучше делать одиночка, чтобы использовать перечисление с одним INSTANCE
элемента.
See this post for an explanation
Я не уверен, что это отвечает на вопрос точно. Поскольку GSON использует отражение, он возвращает экземпляр класса. Если бы я хотел 'getInstance()' мне понадобится 'setInstance (новый Gson(). FromJson (reader, ApplicationModel.class))', если я читаю вас правильно, это откроет возможность изменить экземпляр singleton. Это делает этот подход открытым для потенциальной ошибки?Если пользователь по какой-то причине устанавливает экземпляр на что-то еще, по какой-то причине синглтон внезапно становится чем-то новым. Я остался с моей первоначальной реализацией, так как это предотвращает потенциальные внешние вмешательства ... –