シングルトンの遅延初期化は過大評価されており、通常は必要なく、適切よりも多くの問題を引き起こします。synchronized同期(時間のかかる操作)が毎回実行されるため、静的ゲッター全体を作成するための単純なアプローチは良くありません。
ダブルチェックロックや初期化オンデマンドホルダーなど、より優れたアプローチがいくつかありますが、最も単純で通常は最良のアプローチは、JoshBlochの列挙型アプローチです。単一の要素で作成するenumと、防弾シングルトンが得られます。
public enum Mongo {
INSTANCE;
// instance fields, methods etc. as in any other class
}
privateこれは、コンストラクターとインスタンスを備えたクラスとほぼ機能的に同等ですが、より簡潔な構文と、リフレクションやデシリアライズpublic static finalを介しても他のインスタンスを作成できないことを揺るぎなく保証するいくつかの優れた内部機能を備えています。
このアプローチは必ずしも熱心ではないことに注意してください。シングルINSTANCEは、クラスがJVMにロードされた直後に作成さMongoれます。これは、プログラムの開始直後にはハッピングされません。実際には、クラスが最初に参照されたときに発生します。この場合、staticフィールドまたはメソッドにアクセスします。
そして、それ以外に静的フィールドがなくINSTANCE、静的メソッドがない場合、これは実際に最初にINSTANCEアクセスされた後に発生します。
Mongo mongo = Mongo.INSTANCE;
言い換えれば、明示的な同期の問題がなく、実際には怠惰です。