私はデザイン パターンを開発しており、Java 仮想マシンのクラスのインスタンスが 1 つだけ存在し、何らかのリソースに対するすべての要求を 1 つのポイントに集約できるようにしたいと考えていますが、それが可能かどうかわかりません。
クラスのインスタンスを数えて、最初のインスタンスが作成された後にすべてのインスタンスを破棄する方法しか思いつきません。
これは正しいアプローチでしょうか? そうでない場合、他の方法はありますか?
ベストアンサー1
使用シングルトンパターン。最も簡単な実装は、private constructor
とfield
その結果を保持する 、static
および のような名前のアクセサ メソッドで構成されますgetInstance()
。
プライベートフィールドは、静的初期化ブロック内から割り当てることができます。または、もっと簡単には初期化子を使用して割り当てることができます。メソッドgetInstance()
(パブリックである必要があります)は、このインスタンスを単に返します。
public class Singleton {
private static Singleton instance;
/**
* A private Constructor prevents any other class from
* instantiating.
*/
private Singleton() {
// nothing to do this time
}
/**
* The Static initializer constructs the instance at class
* loading time; this is to simulate a more involved
* construction process (it it were really simple, you'd just
* use an initializer)
*/
static {
instance = new Singleton();
}
/** Static 'instance' method */
public static Singleton getInstance() {
return instance;
}
// other methods protected by singleton-ness would be here...
/** A simple demo method */
public String demoMethod() {
return "demo";
}
}
メソッド内で「遅延評価」を使用する方法getInstance()
(デザイン パターンで推奨されている) は、Java ではすでに「遅延読み込み」が使用されているため、Java では不要であることに注意してください。シングルトン クラスは、呼び出されない限り読み込まれない可能性が高いため、シングルトン変数をテストgetInstance()
してそこでシングルトンを作成することによって、シングルトンの構築を必要になるまで延期しようとするのは意味がありません。getInstance()
null
このクラスの使用も同様に簡単です。参照を取得して保持し、そのメソッドを呼び出すだけです。
public class SingletonDemo {
public static void main(String[] args) {
Singleton tmp = Singleton.getInstance();
tmp.demoMethod();
}
}
一部のコメンテーターは、シングルトンは、サブクラスclone()
による「不正行為」を避けるために、例外をスローするだけの public final メソッドも提供すべきだと考えていますclone()
。ただし、プライベート コンストラクターのみを持つクラスはサブクラス化できないことは明らかなので、このような偏執病は必要ないようです。