使用Singleton共享变量

我一直很难理解如何使用单例来共享一个公共变量。 我正在尝试制作一个黑莓应用程序,它有两个入口点需要共享一个公共变量iconCount。 我被建议在论坛上使用带有RunTimeStore API的单例。 谷歌搜索最终导致:

http://docs.blackberry.com/en/developers/deliverables/17952/CS_creating_a_singleton_by_using_rutnime_store_1554335_11.jsp

我在谷歌的几页深处,但我仍然无法理解它的作用以及如何实现它。 我目前的理解是,单身人士将通过代码以某种方式创建一个“全局变量”:

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,所以如果有人能解释这一点,请记住你正在与新手沟通,我将非常感激。 提前致谢!

它们的意思是请确保用户只初始化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); } 

因此应用程序将首先进行validation,如果已经有一个实例,它将更新现有实例,如果不是,它将创建新实例。

你会打电话

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();

您不能将MySingleton类强制转换为Integer。

在你的例子中,你不使用你的单身,而是使用RuntimeStore!

您可以使用类Singleton的整数字段,在单例(私有构造函数)的构造函数中初始化为0,并通过执行以下操作来获取它:

 MySingleton.getInstance().getIntegerField() 

这里是对单身人士模式的详细描述: http : //en.wikipedia.org/wiki/Singleton_pattern

我认为你误解了单身人士的使用。 单例不会在RuntimeStore中注入,它是一个经典的java对象。 唯一知道关于单例的subtile是它的构造函数是私有的,而MySingleton类只能有一个实例,当你的singleton.getInstance()被调用时它总是被返回