私はシングルトンをインスタンス化する3つの方法を見つけましたが、それらのどれかが最高のものかどうか疑問を持っています。私はそれらをマルチスレッド環境で使用しており、遅延インスタンス化を好む。
サンプル1:java singleton instantiation
private static final ClassName INSTANCE = new ClassName();
public static ClassName getInstance() {
return INSTANCE;
}
サンプル2:
private static class SingletonHolder {
public static final ClassName INSTANCE = new ClassName();
}
public static ClassName getInstance() {
return SingletonHolder.INSTANCE;
}
サンプル3:
private static ClassName INSTANCE;
public static synchronized ClassName getInstance()
{
if (INSTANCE == null)
INSTANCE = new ClassName();
return INSTANCE;
}
私はATMを使用しているプロジェクトは、どこにでもサンプル2を使用していますが、私種類のサンプルのように3つ以上。 Enumバージョンもありますが、私はそれを取得しません。
ここでの質問は、どのような場合にこれらのバリエーションを使用すべきか/使用すべきでないかです。私は長い説明を探しているわけではありませんが(それについての他の話題はたくさんありますが、結局彼らはIMOを主張するようになります)、私はいくつかの言葉で理解できるようにしたいと思います。
しかし、どうすれば使用できますか?たとえば、私はこれを持っています: パブリッククラスMyClass { 公開列挙型ClassName { インスタンス; //代わりにすべてのメソッドを配置しますか... } //ここに私は普通でしょうか? } 編集:いいえ、コメントの書式はありませんか??それを憎む! – jurchiks
シングルトンのフィールドとメソッドを以下に記述します。そして、 'ClassName.INSTANCE.doSomething(foo)'でアクセスしてください。 – Bozho
@jurchiks:はい。他の場所では、シングルトンメソッドを使うために 'ClassName.INSTANCE.methodName()'を呼び出すでしょう(あるいは、静的インポートを使って 'ClassName.INSTANCE.')部分を取り除くことになります。 – Carl