私はこの出くわしたとき、私は、コードの一部を通過したオブジェクトにアクセス修飾子を付けることはできますか?
public class ClassicA {
private static ClassicA instance = null;
}
私はそのような事を使用していないし、それは、それがどのように使われるか何を意味するのか知りたいと思ったことがありません。また、オブジェクトのアクセス修飾子の目的は何ですか?どんな例/リンクも大歓迎です。
私はこの出くわしたとき、私は、コードの一部を通過したオブジェクトにアクセス修飾子を付けることはできますか?
public class ClassicA {
private static ClassicA instance = null;
}
私はそのような事を使用していないし、それは、それがどのように使われるか何を意味するのか知りたいと思ったことがありません。また、オブジェクトのアクセス修飾子の目的は何ですか?どんな例/リンクも大歓迎です。
おそらくClassicA
がシングルトンであることを意味します。これは、通常、プライベートコンストラクタの宣言、および単一のpublic static getInstance()
メソッドの宣言に関係します。
シングルトンは、アプリケーション全体に1つのグローバルインスタンスClassicA
が存在することを確認する場合に使用します。それをインスタンス化する代わりにgetInstance()
と呼びます。これはインスタンス化されたかどうかをチェックします。存在する場合は、それをインスタンス化し、結果のオブジェクトをプライベートinstance
フィールドに格納します。既に構築されている場合は、再インスタンス化せずにinstance
フィールドを返してください。
これは悪い習慣とみなされます。参照してください:https://softwareengineering.stackexchange.com/questions/40373/so-singletons-are-bad-then-what
これはクラスの(静的な)メンバであり、はい、these can have access modifiersです。 (他の人が指摘しているように、実際にはシングルトンの一部のように見えます)
まあ、クラスClassicA
はnullであるプライベートと静的フィールドinstance
を持っています。 ゲッター/セッターがない場合、そのフィールドにアクセスする唯一の方法はリフレクションを使用することです。
シングルトンのように見えるので、getterもあります。instance
が返され、nullの場合は最初にインスタンスが作成され、フィールドに割り当てられます。
private static
は、instance
がクラスのすべてのインスタンスと静的メソッドで利用可能であることを意味します。実際には静的なプライベートメソッドを持つようなものです。
このようなトリックは、例えばシングルトンを実装するために使用できます。つまり、内部的にクラスのインスタンスを1つ保持し、必要に応じてクラスのクライアントに渡すことができます。静的メソッドとあるクラスのインスタンスの間で何かを共有する必要がある場合は、
これは通常、Singleton design patternを示すクラスで使用されます。
これらのタイプのオブジェクトでは、最大で1つのインスタンスしか必要ではないという点が重要です。あなたは、クラスのためのプライベートコンストラクタを作成し、通常プライベートインスタンス変数がまだ設定されているかどうかをチェックするgetInstanceというpublic静的メソッドを作成します。まだ設定されていない場合は、クラスの新しいインスタンスを作成してインスタンスに割り当て、そのインスタンスを返します。オブジェクトがすでに作成されている場合は、単にそれを返します。このように:
次に、どこからでもシングルトンオブジェクトを簡単に取得できます。
このように、シングルトンは、PHPなどの言語で効果的なグローバル変数です。私は、他の人がインスタンスへの参照を再割当てするのを防ぐことができ、設計の観点から非常に悪いかもしれないその他のトリッキーを防ぐことができるので、よりクリーンであると主張します。
は通常、人々はより多くの情報のためthisを参照して、ファクトリクラスとビルダークラスの、そのようなDBオブジェクトとしてデータアクセス、いくつかのタイプを管理するクラスのためにそれを使用
おそらく、そのクラスにインスタンスの静的ゲッターがあります注意してください競争条件... – yshavit
public syncrhonized?または単にsynchronized(MySingleton.class)を使用しますか? getInstanceについて –
それはそれを行うでしょう(2つは本質的に同等です)。しかし、それは同期のボトルネック(大きな問題ではないかもしれません)を追加します。もう一つのアプローチは[double-checked locking](http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java)ですが、特に 'instance'を' volatile'にする必要があることに注意してください。しかし、最良のアプローチは、おそらく遅延ロードではないでしょう: 'private static MySingleton instance = new MySingleton()'。そのイニシャライザ自体は遅延ロードされています(クラスをロードするときに実行されます。最初に使用するときにのみ実行されます)。これで十分です。 – yshavit
。 – BigMike