- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 Gson 将 Json 反序列化为模型 ApplicationModel
。我希望这个模型是一个单例,这样我就可以在我的应用程序的其他地方访问它。
现在,当 Gson 创建此类的一个实例时,我正在以一种非常规的方式创建单例实例。见下文:
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()
返回相同的模型一样有效,但不知何故这似乎不正确。
我的问题是“这是解决问题的好方法还是有更好的解决方案???”
编辑
实现单例的一种更好的方法是使用带有一个 INSTANCE
元素的枚举。
最佳答案
我建议在模型上实例化单例实例,而不是使用构造函数实例化它。
public class ApplicationModel {
private static ApplicationModel instance; //= new ApplicationModel();
//instantiating here is called an "Eagerly Instantiated"
private GeneralVO general;
private ApplicationModel() {
}
public static ApplicationModel getInstance() {
//instantiating here is called "Lazily Instantiated", using :
//if (instance==null) { --> Check whether 'instance' is instantiated, or null
// instance = new ApplicationModel(); --> Instantiate if null
//}
return instance; //return the single static instance
}
public String getVersionDate() {
return general.getVersionDate();
}
}
通过将构造函数设置为私有(private),可以防止对象被另一个类重新实例化,要使用该对象,您必须使用 ApplicationModel.getInstance()
调用该对象。
所以如果你想设置值,调用ApplicationModel.getInstance().setterMethod(value)
,为什么这很有用?如果你想跟踪变化,你只需要跟踪setter方法。如果您使用了构造函数,您还必须跟踪构造函数。
示例:
// To SET the value:
// instead of ApplicationModel model1 = new Gson().fromJson(reader,ApplicationModel.class);
ApplicationModel.getInstance.setValue(new Gson().fromJson(reader,ApplicationModel.class);
// To GET the value :
ApplicationModel.getInstance.getValue();
“Eager Instantiation”与“Lazy Instantiation”:
不止于此,您可以通过 google 获取更多信息,但我认为这对您来说应该已经足够了。
希望这对你有帮助,祝你好运^^
问候,
里德
关于android - 使用Gson将Json反序列化为单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18892649/
出于好奇,我尝试了一些原型(prototype)制作,但似乎只允许在第一个位置使用子例程的原型(prototype) &。 当我写作时 sub test (&$$) { do_somethin
我需要开发一个类似于 Android Play 商店应用程序或类似 this app 的应用程序.我阅读了很多教程,发现几乎每个教程都有与 this one 类似的例子。 . 我已经开始使用我的应用程
考虑一个表示“事件之间的时间”的列: (5, 40, 3, 6, 0, 9, 0, 4, 5, 18, 2, 4, 3, 2) 我想将这些分组到 30 个桶中,但桶会重置。期望的结果: (0, 1,
我是一名优秀的程序员,十分优秀!