使用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()被调用时它总是被返回