2012-01-20 7 views
0

シングルトンを使用して共通の変数を共有する方法を理解するのに苦労しています。私は共通の変数iconCountを共有する必要がある2つのエントリポイントを持つブラックベリーアプリを作ろうとしています。私はフォーラムで誰かがRunTimeStore APIでシングルトンを使うことを勧めました。最終的に周りグーグルでは、につながる:シングルトンを使用して変数を共有する

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

私はグーグルの深いいくつかのページとなっているが、私はまだこれが何をするのか理解can`tと、それを実装する方法。

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を始めたばかりなので、これは非常に新しいものです。だれかがこのことを念頭に置いて説明することができれば、あなたは初心者とコミュニケーションしています。私はとても感謝しています。前もって感謝します!

答えて

0

MySingletonを初期化していることを確認してくださいあなたは複数のインスタンスに問題がなく、同時に2つのカウントを初期化することができます。私は複数のインスタンスから以下のようなものを意味します:

Mysingleton single = new Mysingleton(); 
Mysingleton single2 = new Mysingleton(); 

両方のinitilaizationがdiffetentカウントを持つことができるので。インスタンスがすでに存在しているのであれば、アプリケーションが、最初の検証を行います

public static void main(String[] args){ 

    IconManager iconManager = IconManager.getInstance(); 
    iconManager.setCount(iconmanager.getCount() + 1); 

} 

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

}

、あなたはクラスのインスタンスを作成することができた後:あなたはこのようなものが必要新しいものを作成するよりも、既存のものを更新します。

+0

こんにちは、助けをありがとう、 – user1152440

+0

こんにちは、おかげでIconManager.getRuntimeStore()。行(GUID、シングルトン)の行; getRuntimeStore()を持つIconManagerのメソッドが存在しないため、動作しないようです。 RuntimeStore.getRuntimeStore()。put(GUID、singleton)を実行する場合にのみ機能します;今すぐテクニックをテストします – user1152440

+0

@ user1152440はい、ランタイムストアにする必要があります。 – HRgiger

1

あなたのアプリでインスタンスを取得するために

MySingleton.getInstance()

を呼び出します。要点は、getInstanceが基礎となるオブジェクトへのアクセスを制御していることです。

また、コンストラクタを非公開にして、そのファイルでのみアクセスできるようにする必要があります。

シングルトンクラスでプロパティを定義するには、非静的プロパティを宣言するだけです。クラスの各インスタンスは独自のコピーを持ちますが、オブジェクトの作成を制御しているので、JVMごとに1つだけにする必要があります。だから、

class MySingleton { 
    private static MySingleton _instance; 
    private static final long GUID = 0xab4dd61c5d004c18L; 

    private Integer iconCount; // non-static method, add a public getIconCount below 
    ... 
} 

、その後、あなたはあなたが整数にごMySingletonクラスをキャストすることはできません

MySingleton.getInstance().getIconCount();

+0

両方のifステートメントがインスタンスを初期化する異なるコードを持つとすると、インスタンスをインスタンス化する2つの方法があるようです。 1つはゼロから、もう1つは "runtimeStore"からです。キャッシュからシングルトンを取得しようとするように思えますが、そこになければシンクを作成します。これは "半"有効です。 – rfeak

+0

@rfreak、thanx、まだそれは私を悩ませますが、絶対に壊れていません。 – hvgotcodes

+0

その時点で全く同意します。それは間違っているようだ。私はBlackberryプログラミングについてジャックを知らないので、プログラミング環境に固有のものかもしれないと思った。 – rfeak

0

経由でアクセスすることができます。

あなたの例では、シングルトンを使用せずにランタイムストアを使用します。

あなたはシングルトン(プライベートコンストラクタ)のコンストラクタで0にinitalizedクラスシングルトンの整数フィールドを使用して行うことによってそれを得ることができます。

MySingleton.getInstance().getIntegerField() 

をここにシングルトンパターンのdetailled説明です: http://en.wikipedia.org/wiki/Singleton_pattern

シングルトンの使用を誤解していると思います。シングルトンはあなたのRuntimeStoreに注入されません、それは古典的なJavaオブジェクトです。 Singleton.getInstance()が呼び出されたときに常に返されるインスタンスは、MySingletonクラスには1つしか存在できません。

関連する問題