0

おはようございます。

私は現在、ApacheTomcat7サーバーにデプロイされているJavaWebサービスプロジェクトに取り組んでいます。プロジェクトのニーズに応じて、グローバル(WSスレッド間で、すべてのリクエストによって作成される)オブジェクトをメモリに保持する必要があります。したがって、私は次のようにシングルトンデザインパターンを実装しようとしました。

public class SingletonDesign {
    private static boolean _instanceFlag = false;
    private static final SingletonDesign _instance = new SingletonDesign();
    private static GlobalObject _myGlobalObject;

    private SingletonDesign() {
        if(_instanceFlag == false) {
            _myGlobalObject = new GlobalObject();
            _instanceFlag = true;
        }
    }

    public static GlobalObject getModel() {
        if(_instanceFlag == false) {
            _myGlobalObject = new GlobalObject();
            _instanceFlag = true;
        }
        return _myGlobalObject;
    }

    public static int parseModel() {
        if(_instanceFlag == false) {
            _myGlobalObject = new ItemSimilarityModel();
            _instanceFlag = true;
        }
        int val = _myGlobalObject.parseFromFile();
        return val;
    }
}

リクエストが行われるたびに、新しいスレッドがWeb上に作成されるという事実を認識しています–サービスクラス(オブジェクト)。私の目標は、すべてのスレッドにグローバルなSingletonDesignオブジェクトを含めることです。これは、メモリ内で存続し、一度だけ作成されます。上記のデザインは私の期待どおりに機能しているように見えますが、それが正しいかどうかはよくわかりません。だからこれらは私の質問です:

1)SingletonDesignオブジェクトのメソッドを静的にする必要があるのはなぜですか?(私はそれらを非静的として定義しようとしましたが、私のシングルトンオブジェクトは正しく初期化されていません)。

2)上記のデザインは、シングルトンデザインパターンのウィキペディアページから見たものです。私を混乱させる部分は、他のシングルトン実装でも見た_instanceフィールドの初期化です。なぜそのオブジェクトが必要なのですか?

3)サーバーが停止するまで、オブジェクトは存続しますか?私はいくつかのテストを行いました、そしてそれは生きているようです、しかし私は100%確信している必要があります。

お手数をおかけしますが、よろしくお願いいたします。

4

2 に答える 2

2

フィールドには_instanceシングルトンが含まれます。静的メソッドが必要getInstance()であり、他のメソッドはインスタンスメソッドになります。私はあなたが_instanceFlagフィールドをまったく必要としないと思います。

次に、次のように呼び出します。

SingletonDesign.getInstance()。getGlobalObject();

それでも、多くの人(私を含む)がコードの臭いとしてシングルトンを使用していることを覚えておいてください。また、この設計は、Javaでシングルトンを実装するための最良の方法とは見なされていません。cfr:Javaでシングルトンパターンを実装する効率的な方法は何ですか?

クラスローダーが存続している限り、オブジェクトは存続します。

于 2012-09-03T11:15:48.170 に答える
1

1)シングルトンで実際に必要な静的メソッドは、シングルトンのインスタンスを返すメソッドだけです。シングルトンをインスタンス化できないため、メソッドは静的である必要があります。したがって、メソッドはオブジェクトではなくクラスに属している必要があります。

2)開始するのがより簡単かもしれない単純化されたバージョン:

public class MySingleton {

    private static MySingleton instance = null;
    private static String aString = null;

    private MySingleton( {
        aString = new String("Hello, world");
    }

    public static MySingleton getInstance() {
        if (instance == null) {
            instance = new MySingleton();
        }

        return instance;
    }

    public string getMyString() {
        return aString;
    }
}

3)私の知る限り、JVMが実行されている限り存続します。

ヒントとして、インスタンスを返すメソッドで何らかの初期化コードを実行する場合は、メソッドを同期済みとして宣言することもお勧めします。

于 2012-09-03T11:13:09.233 に答える