Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用单例共享变量_Java_Blackberry - Fatal编程技术网

Java 使用单例共享变量

Java 使用单例共享变量,java,blackberry,Java,Blackberry,我一直很难理解如何使用单例来共享一个公共变量。我正在尝试制作一个黑莓应用程序,它有两个入口点,需要共享一个公共变量iconCount。论坛上有人建议我使用带有RuntimeStoreAPI的singleton。谷歌搜索最终会导致: 我对谷歌有过几页深入的了解,但我仍然无法理解它的作用以及如何实现它。我目前的理解是,单例将通过以下代码以某种方式创建“全局变量”: class MySingleton { private static MySingleton _instance; pri

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

我对谷歌有过几页深入的了解,但我仍然无法理解它的作用以及如何实现它。我目前的理解是,单例将通过以下代码以某种方式创建“全局变量”:

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

}