2012-05-08 14 views
1

私はこの出くわしたとき、私は、コードの一部を通過したオブジェクトにアクセス修飾子を付けることはできますか?

public class ClassicA { 
    private static ClassicA instance = null; 
} 

私はそのような事を使用していないし、それは、それがどのように使われるか何を意味するのか知りたいと思ったことがありません。また、オブジェクトのアクセス修飾子の目的は何ですか?どんな例/リンクも大歓迎です。

+0

。 – BigMike

答えて

4

おそらくClassicAがシングルトンであることを意味します。これは、通常、プライベートコンストラクタの宣言、および単一のpublic static getInstance()メソッドの宣言に関係します。

シングルトンは、アプリケーション全体に1つのグローバルインスタンスClassicAが存在することを確認する場合に使用します。それをインスタンス化する代わりにgetInstance()と呼びます。これはインスタンス化されたかどうかをチェックします。存在する場合は、それをインスタンス化し、結果のオブジェクトをプライベートinstanceフィールドに格納します。既に構築されている場合は、再インスタンス化せずにinstanceフィールドを返してください。

これは悪い習慣とみなされます。参照してください:https://softwareengineering.stackexchange.com/questions/40373/so-singletons-are-bad-then-what

+0

厳密に言えば、これはクラスがシングルトンであることを意味するものではありません。パブリックコンストラクタが存在する可能性があります。私は、クラスのソースコードが完全ではないと仮定します。そうでなければ、あまり意味がありません。 – Vlad

+0

@Vlad: "おそらく"が追加されました。ありがとう。 –

+0

@Truth:ありがとう、それで私のコメントを削除しました:-) – noMAD

1

その基本的に作者が生きて、このクラス(インスタンスフィールド)の唯一の1インスタンスがあるように意図singleton コンストラクタは、おそらくプライベートで唯一のクラス内で使用されます。

+1

リンクを投稿するのではなく、説明のビットで書くのが一般的に役立ちます。 –

+0

ok、+ description – radai

1

これはクラスの(静的な)メンバであり、はい、these can have access modifiersです。 (他の人が指摘しているように、実際にはシングルトンの一部のように見えます)

0

シングルトンパターンに使用されます。 here

+4

私は10kユーザーからのより良い答えを期待しています。 –

+0

@Truth私はポイントを気にします:10kのユーザー。 – peeyush

+0

@Truth:仕事があれば、SOは待たなければなりません。 –

3

まあ、クラスClassicAはnullであるプライベートと静的フィールドinstanceを持っています。 ゲッター/セッターがない場合、そのフィールドにアクセスする唯一の方法はリフレクションを使用することです。

シングルトンのように見えるので、getterもあります。instanceが返され、nullの場合は最初にインスタンスが作成され、フィールドに割り当てられます。

0

private staticは、instanceがクラスのすべてのインスタンスと静的メソッドで利用可能であることを意味します。実際には静的なプライベートメソッドを持つようなものです。

このようなトリックは、例えばシングルトンを実装するために使用できます。つまり、内部的にクラスのインスタンスを1つ保持し、必要に応じてクラスのクライアントに渡すことができます。静的メソッドとあるクラスのインスタンスの間で何かを共有する必要がある場合は、

1

これは通常、Singleton design patternを示すクラスで使用されます。

これらのタイプのオブジェクトでは、最大で1つのインスタンスしか必要ではないという点が重要です。あなたは、クラスのためのプライベートコンストラクタを作成し、通常プライベートインスタンス変数がまだ設定されているかどうかをチェックするgetInstanceというpublic静的メソッドを作成します。まだ設定されていない場合は、クラスの新しいインスタンスを作成してインスタンスに割り当て、そのインスタンスを返します。オブジェクトがすでに作成されている場合は、単にそれを返します。このように:

次に、どこからでもシングルトンオブジェクトを簡単に取得できます。

このように、シングルトンは、PHPなどの言語で効果的なグローバル変数です。私は、他の人がインスタンスへの参照を再割当てするのを防ぐことができ、設計の観点から非常に悪いかもしれないその他のトリッキーを防ぐことができるので、よりクリーンであると主張します。

は通常、人々はより多くの情報のためthisを参照して、ファクトリクラスとビルダークラスの、そのようなDBオブジェクトとしてデータアクセス、いくつかのタイプを管理するクラスのためにそれを使用

おそらく、そのクラスにインスタンスの静的ゲッターがあります
+0

注意してください競争条件... – yshavit

+0

public syncrhonized?または単にsynchronized(MySingleton.class)を使用しますか? getInstanceについて –

+0

それはそれを行うでしょう(2つは本質的に同等です)。しかし、それは同期のボトルネック(大きな問題ではないかもしれません)を追加します。もう一つのアプローチは[double-checked locking](http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java)ですが、特に 'instance'を' volatile'にする必要があることに注意してください。しかし、最良のアプローチは、おそらく遅延ロードではないでしょう: 'private static MySingleton instance = new MySingleton()'。そのイニシャライザ自体は遅延ロードされています(クラスをロードするときに実行されます。最初に使用するときにのみ実行されます)。これで十分です。 – yshavit