使用Singleton共享变量

时间:2012-01-20 16:43:47

标签: java blackberry

我一直很难理解如何使用单例来共享公共变量。我正在尝试制作一个黑莓应用程序,它有两个入口点需要共享一个公共变量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,所以如果有人能够解释这一点,请记住你正在与新手沟通,我将非常感激。提前谢谢!

3 个答案:

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

}

因此,应用程序将首先进行验证,如果已经存在实例,它将更新现有实例,如果不是,则会创建新实例。