gpt4 book ai didi

android - 使用Gson将Json反序列化为单例

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:08 26 4
gpt4 key购买 nike

我正在使用 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 元素的枚举。

See this post for an explanation

最佳答案

我建议在模型上实例化单例实例,而不是使用构造函数实例化它。

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com