我一直很难理解如何使用单例来共享公共变量。我正在尝试制作一个黑莓应用程序,它有两个入口点需要共享一个公共变量iconCount。我被建议在论坛上使用带有RunTimeStore API的单例。谷歌搜索最终导致:
我在谷歌的几页深处,但我仍然无法理解它的作用以及如何实现它。我目前的理解是,单身人士将通过代码以某种方式创建一个“全局变量”:
class MySingleton {
private static MySingleton _instance;
private static final long GUID = 0xab4dd61c5d004c18L;
// constructor
MySingleton() {}
public static MySingleton getInstance() {
if (_instance == null) {
_instance = (MySingleton)RuntimeStore.getRuntimeStore().get(GUID);
if (_instance == null) {
MySingleton singleton = new MySingleton();
RuntimeStore.getRuntimeStore().put(GUID, singleton);
_instance = singleton;
}
}
return _instance;
}
}
另一个问题是如何从这个单例中创建一个变量?我需要在开头声明变量iconCount = 0,然后才能使用它。宣称它会像
Integer iconCount = (Integer) RuntimeStore.getInstance();
?这对我来说是非常新的,因为我刚刚开始使用Java,所以如果有人能够解释这一点,请记住你正在与新手沟通,我将非常感激。提前谢谢!
答案 0 :(得分:1)
你会打电话给
MySingleton.getInstance()
在您的应用中获取实例。关键是getInstance
正在控制对底层对象的访问。
此外,您应该将构造函数设为私有,因此只能在该文件中访问它。
要在您的单例类上定义属性,只需声明一个非静态属性。该类的每个实例都有自己的副本,但是您正在控制对象的创建,因此它们应该只有1(每个JVM)。所以
class MySingleton {
private static MySingleton _instance;
private static final long GUID = 0xab4dd61c5d004c18L;
private Integer iconCount; // non-static method, add a public getIconCount below
...
}
然后您可以通过
访问它 MySingleton.getInstance().getIconCount();
答案 1 :(得分:0)
您无法将MySingleton类强制转换为Integer。
在你的例子中,你不使用你的单身人士,而是使用RuntimeStore!
您可以使用类Singleton的整数字段,在单例(私有构造函数)的构造函数中初始化为0,并通过执行以下操作来获取它:
MySingleton.getInstance().getIntegerField()
这里是单例模式的详细描述: http://en.wikipedia.org/wiki/Singleton_pattern
我认为你误解了单身人士的使用。单例不会在RuntimeStore中注入,它是一个经典的java对象。关于单例的唯一认识是它的构造函数是私有的,而MySingleton类只能有一个实例,当你调用singleton.getInstance()时它总是返回
答案 2 :(得分:0)
他们的意思是请确保用户只初始化MySingleton类,这样您就不会遇到多个实例的问题并同时初始化两个计数。我的意思是来自多个实例,如下所示:
Mysingleton single = new Mysingleton();
Mysingleton single2 = new Mysingleton();
因为两种初始化都可以有不同的数量。你需要这样的东西:
public class IconManager {
private static iconManager _instance;
private static final long GUID = 0xab4dd61c5d004c18L;
private static int count = 0;
// constructor
IconManager() {
}
public static IconManager getInstance() {
if (_instance == null) {
_instance = (IconManager) RuntimeStore.getRuntimeStore().get(GUID);
if (_instance == null) {
IconManager singleton = new IconManager();
RuntimeStore.getRuntimeStore().put(GUID, singleton);
_instance = singleton;
}
}
return _instance;
}
public static int getCount() {
return count;
}
public static void setCount(int count) {
this.count = count;
}
}
之后可以为该类创建实例:
public static void main(String[] args){
IconManager iconManager = IconManager.getInstance();
iconManager.setCount(iconmanager.getCount() + 1);
}
因此,应用程序将首先进行验证,如果已经存在实例,它将更新现有实例,如果不是,则会创建新实例。