あなたがこれを行うことができ、Javaの静的シングルトンの遅延初期化やって:最初のgetInstance()
が呼び出されるまでBob()
が作成されていないアクセス時に内部クラスSingletonWrapper
のみがロードされているので静的なシングルトンと同様の方法で、Javaメンバーの無駄な遅延ロードを取得できますか?
public class Bob {
private static class SingletonWrapper {
private static final Bob instance = new Bob();
}
public static Bob getInstance() {
return SingletonWrapper.instance;
}
}
を。
私の質問は、非静的コンテキストでメンバー変数の遅延インスタンス化を行うために使用できる類似のトリックがあるかどうかです。
public class Bob {
// Clearly this doesn't work as not lazy
private final InnerWrapper wrapper = new InnerWrapper();
private class InnerWrapper {
private final Jane jane = new Jane();
}
public Jane getJane() {
return wrapper.jane;
}
}
我々はBob
内Jane
のインスタンスがあり、ダブルチェックロックまたはAtomicReference
を使用せずにオンデマンドでのみ作成されたインスタンスを安全にスレッド持つことができますどのような方法があります。理想的には、getメソッドはこれらの例のように単純なままにしておく必要がありますが、可能でない場合はget
メソッドの最も簡単で高速な(最も効率的な)実行が理想的です。
@assyliasをコメントはそれが遅延初期化しないだろう言うように。 'Bob 'を作成するとすぐに、いつも即座に' Jane'を作成します。 –
私はあまりにも速く読んでいません - あなたがAtomicReferenceを望んでいない理由は何ですか? CHMオプションよりも優れたパフォーマンスを発揮するでしょう。 – assylias
@assylias特に理由はありません。基本的に私は自分のオプションが何であるか知りたがっています。スタティックラッパートリックはシングルトンの初期化を怠っていることを考慮すると、怠惰なメンバー初期化のために似たようなことはできません。 –