シングルトンの遅延初期化は過大評価されており、通常は必要なく、適切よりも多くの問題を引き起こします。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;
言い換えれば、明示的な同期の問題がなく、実際には怠惰です。