2017-09-13 12 views
1

私のプロジェクトでは、JSONオブジェクトを使用してクライアントに応答しました。マイJSONObject
JSONObjectシングルトンの使用

JSONObject jsonObj = new JSONObject(); 

たびに、私はnewキーワードを使用してJSONオブジェクトを作成しています。 newキーワードを使用して作成したくありません。これに対して はSingleton patternを実装できますか?

マイSingletoneクラスコード:

public class SingletonInstance { 


     private static SingletonInstance instance = new SingletonInstance(); 


     private SingletonUmtInstance() { 

     } 

     // Get the only object available 
     public static JSONObject getInstance() { 

      if (instance == null) { 
       instance = new JSONObject(); 
       return instance; 
      } else { 
       return instance; 
      } 

     } 
} 

私が使用しますインスタンスを作成するには:

JSONObject DBCon = SingletonInstance.getInstance(); 

はこれが正しい方法です?

+1

これはこの質問の適切な場所だとは思わない – Mritunjay

+0

私はちょうど私が正しいアプローチを使っていることを知りたがっています。 – ansh

答えて

2

シングルトンデザインパターンはインスタンス化を制限し、クラスのインスタンスが1つだけJVMに存在するようにします。

シングルトンを実装する場合は、getInstance()メソッドを呼び出すたびに同じインスタンスを必ず使用するようにしてください。

あなたのコードについては、条件if (instance == null)は無用であり、あなたのgetInstance()方法は同等です:シングルトンや静的な方法に新しいオブジェクトを作成からのアプローチを変更する前に

public static JSONObject getInstance() { 
     return instance; 
} 
+0

ありがとうございましたImen、私は条件を削除しました 'if(instance == null)'、ちょうど私が正しいアプローチを使用していることを知りたい。 – ansh

+0

毎回同じインスタンスを使用する場合は、正しい方法です。毎回新しいインスタンスが必要な場合、シングルトンはあなたのために適切ではありません。 –

1

、必ずアプリケーションがで使用されていない作りますマルチスレッド環境。

json文字列をJSONObjectコンストラクタに渡して、状態を保持していることを意味します。これをシングルトンまたは静的に変更すると、マルチスレッド環境でデータが不一致になります。

シングルトンの実装にはenumを使用します。

+0

こんにちはPrasanna、私のアプリケーションは、マルチスレッド環境ではありません。 – ansh

0

サンプルコードスニペット:

public enum SingletonEnum { 

    INSTANCE; 

    public static JSONObject getJsonObject() {   
     return new JSONObject();  
    } 
} 

、それが呼ばれた時代の「n」の数の同じかかわらず、残っていることを確認するために、オブジェクトのクラス内のhashCodeメソッドを使用します

SingletonEnum singleton = SingletonEnum.INSTANCE; 

を使用してインスタンスを取得します。 。

0

あなたは、このようにそれを行うことができます:

public class SingletonInstance { 

    private SingletonInstance() { }   

    private static class Holder { 
     private static final SingletonInstance INSTANCE = new SingletonInstance(); 
    } 

    public static SingletonInstance getInstance() { 
     return Holder.INSTANCE; 
    } 

} 

この実装は、同様にスレッドセーフです。

関連する問題