1

編集: Web アプリケーションのすべてのセッションに対して共有データベース接続プールを作成しようとしています。別の投稿では、サーブレット コンテキスト オブジェクトを作成する最善の方法は、init リスナーに作成させることであると述べています。ただし、このオブジェクトをサーブレットで使用できるようにする方法は不明です。

4

5 に答える 5

2

1 つの解決策は、プライベート ホルダー クラスを使用することです。

public class SomeClass {
    private static class ResourceHolder {
        private static final Resource INSTANCE = new Resource();
    }

    public static Resource getInstance() { 
        return ResourceHolder.INSTANCE;
    }
}

インスタンスは がSomeClass.getInstance()初めて呼び出されたときに初期化されます。

于 2014-01-17T18:16:59.120 に答える
2

これを行う別の方法は、静的初期化を使用することです。

public class SomeClass {

    private static final Object[] CONTENT;

    static {
        CONTENT = new Object[SomeOtherClass.getContentSize()]; // To show you can access runtime variables
    }

}

CONTENTClassLoader を使用してクラスがロードされると、これにより配列が初期化されます。

于 2014-01-17T18:20:56.350 に答える
1

最も単純な遅延初期化はenum、1 つのインスタンスで を使用することです。

enum Singleton {
    INSTANCE; // lazy initialised
}

追加の問題は、初期化値が必要なことです。これを処理するには、クラスをネストできます。

enum Utility {;
     static MyType val;
     static OtherType val2;

     enum Holder {
         INSTANCE;

         Holder() {
            // uses val and val2
         }
     }

     public static Holder getInstance(MyType val, OtherType val2) {
         Utility.val = val;
         Utility.val2 = val2;
         return Holder.INSTANCE; // only created the first time.
     }
 }

注: 静的ブロックの初期化は安全であるため、これはスレッド セーフです。

于 2014-01-17T18:56:56.280 に答える
0

何かのようなもの:

public static abstract class Lazy<T> {

    private T t = null;

    public synchronized T get() {
        if (t == null) {
            t = create();
        }
        return t;
    }

    protected abstract T create();
}

public static final Lazy<List<String>> lazyList = new Lazy<List<String>>(){

    @Override
    protected List<String> create() {
        return new ArrayList<String>();
    }
}; 
于 2014-01-17T18:21:29.440 に答える