これに遭遇したとき、私はコードを調べていました:
public class ClassicA {
private static ClassicA instance = null;
}
私はそのようなものを使用したことがないので、それが何を意味し、どのように使用されるかを知りたいと思っていました. また、オブジェクトのアクセス修飾子の目的は何ですか? 例/リンクは大歓迎です。
それはおそらくClassicA
シングルトンであることを意味します。これは通常、プライベート コンストラクターと単一のパブリックな静的getInstance()
メソッドの宣言に関係しています。
シングルトンは、アプリケーション全体で のグローバル インスタンスが 1 つだけであることを確認する場合に使用されClassicA
ます。インスタンス化する代わりに、 を呼び出しますgetInstance()
。これは、一度インスタンス化されたかどうかを確認します。存在する場合は、それをインスタンス化し、結果のオブジェクトをプライベートinstance
フィールドに格納します。すでに構築されている場合は、instance
再インスタンス化せずにフィールドを返すだけです。
これは悪い習慣と見なされることに注意してください。参照: https://softwareengineering.stackexchange.com/questions/40373/so-singletons-are-bad-then-what
さて、クラスにはnullでClassicA
あるプライベートおよび静的フィールドがあります。instance
ゲッター/セッターがない場合、そのフィールドにアクセスする唯一の方法はリフレクションを使用することです。
これはシングルトンのように見えるので、返されるゲッターもあると思いますinstance
。それが null の場合は、最初にインスタンスを作成してフィールドに割り当てます。
これは通常、シングルトンデザインパターンを示すクラスに使用されます。
重要なのは、これらのタイプのオブジェクトの場合、必要なインスタンスはせいぜい1つだけであるということです。クラスのプライベートコンストラクターを作成し、通常はgetInstanceというパブリック静的メソッドを作成します。このメソッドで、プライベートインスタンス変数がまだ設定されているかどうかを確認します。まだ設定されていない場合は、クラスの新しいインスタンスを作成してインスタンスに割り当ててから、そのインスタンスを返します。オブジェクトがすでに作成されている場合は、単にそれを返します。このような:
public class MySingleton {
private static MySingleton instance=null;
private MySingleton() {
//do stuff
}
public static MySingleton getInstance() {
if (instance == null) {
instance = new MySingleton();
}
return instance;
}
}
次に、プログラム全体から、どこからでもシングルトンオブジェクトを簡単に取得できます。
したがって、シングルトンは事実上、PHPなどの言語での栄光のグローバル変数にすぎません。他の人がインスタンスへの参照を再割り当てしたり、設計の観点から非常に悪いかもしれない他のトリックを防ぐことができるので、それははるかにクリーンであると私は主張します。
通常、人々は、DBオブジェクトなど、ある種のデータアクセスを管理するクラス、ファクトリクラスおよびビルダークラスに使用します。詳細については、これを参照してください。
そのシングルトン は基本的に、作成者がこのクラスのインスタンスを 1 つだけ有効にすることを意図していました (インスタンス フィールド)。コンストラクターはおそらくプライベートであり、クラス内でのみ使用されます。
これはクラスの (静的) メンバーであり、はい、これらはアクセス修飾子を持つことができます。(そして、他の人が指摘したように、それは確かにシングルトンの一部のように見えます。)
これは、シングルトン パターンに使用されます。こちらをご覧ください
private static
instance
は、クラスのすべてのインスタンスと静的メソッドで使用できますが、それらのみが使用できることを意味します。実際には、静的なプライベート メソッドを持つようなものです。
このようなトリックは、たとえばシングルトンの実装に使用できます。クラスの単一のインスタンスを内部的に保持し、必要に応じてクラスのクライアントに渡すことができます。または、静的メソッドとクラスのインスタンスの間で何かを共有する必要がある場合。