編集: Web アプリケーションのすべてのセッションに対して共有データベース接続プールを作成しようとしています。別の投稿では、サーブレット コンテキスト オブジェクトを作成する最善の方法は、init リスナーに作成させることであると述べています。ただし、このオブジェクトをサーブレットで使用できるようにする方法は不明です。
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
}
}
CONTENT
ClassLoader を使用してクラスがロードされると、これにより配列が初期化されます。
于 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 に答える