-1

以下は、シングルトンとして実行しようとしているコードです

MyResourceBundleSingleton.groovy // Groovy クラス

@Singleton
class MyResourceBundleSingleton {

    public ResourceBundle getResourceBundle () {
        return someService.getMyResourceBundle() // this bundle is returned by calling a separate method
    }

MyResourceBundleSingleton.java // Java クラス

public class MyResourceBundleSingleton {

    private MyResourceBundleSingleton () {
    }

    private static MyResourceBundleSingleton myBundle;

    public static MyResourceBundleSingleton getMyResourceBundleSingletonInstance() {
        if (myBundle == null) {
            synchronized (MyResourceBundleSingleton.class) {
                if (myBundle == null) {
                    myBundle = new MyResourceBundleSingleton();
                }
            }
        }
        return myBundle;
    }

    public ResourceBundle getResourceBundle () {
        return someService.getMyResourceBundle() // this bundle is returned by calling a separate method
    }
}

// Groovy の呼び出し

MyResourceBundleSingleton.instance.getResourceBundle()

// Java を呼び出す

MyResourceBundleSingleton.getMyResourceBundleSingletonInstance().getResourceBundle()

Groovy コードと Java コードの両方が同じメソッドを呼び出しますsomeService.getMyResourceBundle()。Javaコードでは、.properitesファイルがロードされ、呼び出しごとに同じファイルが返されます。これは、シングルトンの適切な方法です。groovy では、@singleton を使用して .properties ファイルに変更があった場合はいつでも変更されたファイルが返されます。なぜこれが起こっているのかわかりません。同じ .properties ファイルが返されることを期待していました。Groovy コードで何か不足していますか??

4

1 に答える 1

1

getResourceBundle()両方のシングルトンでの呼び出しごとにサービスを呼び出しています。これによりプロパティ ファイルが読み込まれると仮定すると、どちらの場合もキャッシュされる理由はありません。Java バージョンがキャッシュされたバージョンを返す場合、コードに表示されていない他の何かがそれを保存しています。

于 2013-04-30T19:17:26.350 に答える