Java 使用单例共享变量
我一直很难理解如何使用单例来共享一个公共变量。我正在尝试制作一个黑莓应用程序,它有两个入口点,需要共享一个公共变量iconCount。论坛上有人建议我使用带有RuntimeStoreAPI的singleton。谷歌搜索最终会导致: 我对谷歌有过几页深入的了解,但我仍然无法理解它的作用以及如何实现它。我目前的理解是,单例将通过以下代码以某种方式创建“全局变量”:Java 使用单例共享变量,java,blackberry,Java,Blackberry,我一直很难理解如何使用单例来共享一个公共变量。我正在尝试制作一个黑莓应用程序,它有两个入口点,需要共享一个公共变量iconCount。论坛上有人建议我使用带有RuntimeStoreAPI的singleton。谷歌搜索最终会导致: 我对谷歌有过几页深入的了解,但我仍然无法理解它的作用以及如何实现它。我目前的理解是,单例将通过以下代码以某种方式创建“全局变量”: class MySingleton { private static MySingleton _instance; pri
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.getInstance()
获取应用程序中的实例。关键是getInstance
正在控制对底层对象的访问
此外,您应该将构造函数设置为私有的,因此它只能在该文件中访问
要在singleton类上定义属性,只需声明一个非静态属性。该类的每个实例都有自己的副本,但您控制着对象的创建,因此它们的副本应该只有1个(每个JVM)。所以
然后你可以通过
MySingleton.getInstance().getIconCount()代码>您不能将MySingleton类强制转换为整数
在您的示例中,您不使用singleton,而是使用RuntimeStore
您可以使用类Singleton的整数字段,在Singleton(私有构造函数)的构造函数中初始化为0,并通过执行以下操作获得该字段:
MySingleton.getInstance().getIntegerField()
以下是单例模式的详细说明:
我想你误解了单身汉的用法。singleton并没有注入到您的RuntimeStore中,它是一个经典的java对象。关于singleton,我想知道的唯一一个细微之处是它的构造函数是私有的,并且类MySingleton只能有一个实例,当您的singleton.getInstance()被称为他们的意思是请确保用户只初始化一次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);
}
因此,应用程序将首先进行验证,如果已经有实例,它将更新现有实例,如果没有,它将创建新实例。鉴于两个if语句初始化实例的代码不同,似乎有两种方法可以实例化实例。一个从零开始,另一个从“runtimeStore”开始。它似乎试图从缓存中获取singleton,如果它不在缓存中,它就会创建它。这似乎是“半”有效的。@rfreak,thanx,这仍然让我感到厌烦,但这并不是完全断然同意这一点。这似乎是错误的。我不知道jack关于Blackberry编程的知识,所以我想这可能是特定于那里编程环境的东西;似乎不起作用,因为IconManager中没有具有getRuntimeStore()的方法。仅当我执行RuntimeStore.getRuntimeStore().put(GUID,singleton)时,它才起作用;我现在就要测试这项技术
public static void main(String[] args){
IconManager iconManager = IconManager.getInstance();
iconManager.setCount(iconmanager.getCount() + 1);
}