2013-09-05 8 views
14

Javaのシングルトンは静的変数またはメンバ変数を使用する必要がありますか?どちらにも利点がありますか?Javaシングルトンは静的変数を使用すべきですか?

+0

参照:http://stackoverflow.com/questions/519520/difference-between-static-class-and-singleton-pattern –

+0

少なくとも1つの静的変数を使用せずにシングルトンを構築できます。 – dasblinkenlight

+0

@dasblinkenlightはい、私は1つ必要ですが、問題はメンバの変数または静的変数のいずれかになりうる他のすべての変数についてです。 – Andreas

答えて

11

メンバー変数を使用する必要があります。シングルトンはオブジェクト(すなわち、クラスのインスタンス)であり、そのようにモデル化されるべきである。それらのうちの1つを作成するつもりであっても。

スタティックは、クラスレベルの変数に使用する必要があります。

+0

メンバー変数は静的変数の親です。http://www.programmerinterview.com/index.php/c-cplusplus/whats-the-difference-between-a-class-variable-and-an-instance-variable/ – SpringLearner

4

あなたは、静的変数の使用を避け、代わりにEnumを使用することができます。

public enum MySingleton { 
    INSTANCE; 
} 

あなたはMySingleton.INSTANCEとしてこのシングルトンにアクセスすることができます。

Enumはスレッドセーフであり、SingletonからEnumまでの実装では、マルチスレッド環境でもシングルトンにインスタンスが1つしか存在しません。

2

静的変数またはメンバー変数を使用することは必須ではありません。シングルトンは論理的に1つのインスタンスしか持たないので、静的変数またはメンバ変数を使用しても差異はありません。静的変数とインスタンス変数の差が保持される以外は、静的変数はクラスのロード時に初期化されますが、インスタンス変数はインスタンス作成時に初期化されます。

一般的なプログラミングルールとして、静的変数が必要かどうかを決定する必要があります。単純にパブリック静的変数を作成し、不要な問題に終止符を打たないでください。ですから私の個人的な意見では、物事を単純でコントロールし続けるためにインスタンス変数を優先させるべきです。

2

静的variables.Youを使用することは必須ではない。そのも

を列挙型を使用することができますそれは具体的な変数に依存this

+0

列挙型は静的な定義であり、静的な変数を使用していることを示していません。それ以外の場合は、列挙型はシングルトンの優れた実装です – Xtroce

2

を参照してください。間違いなく最も一般的な使い方は、メンバ変数を保持する通常のオブジェクトであることです。たとえば、あるオブジェクトを他のオブジェクトと簡単に置き換えることができます(他のすべてのプロパティを使用)。

すべてのクラスは静的変数を持つことができますが、シングルトンであるかどうかは分かりません。

その性質上、シングルトンパターンはオブジェクトのインスタンスを扱います。統計は、クラスのメーターです - >シングルトンパターンとの関係はありません。

1

多くの情報がすでに提供されています。静的変数またはインスタンスを指す静的変数を使用するか、列挙型を使用します。

あなたの単一トンが別のクラスのサブクラスであるクラスのメンバである場合、大きな違いがあります。

したがって、シングルトンインスタンスはスーパークラスから継承されます。

これには大きな利点があります。

列挙型は互いに拡張できませんが、インタフェースを実装する列挙型を使用できます。

5

シングルトンインスタンスへの静的参照が必要ですが、インスタンス自体は通常のクラスと同様にインスタンス変数を使用する必要があります。

なぜなら、シングルトンインスタンスはすべてオブジェクトの後ろにあるからです。だから、普通の良いデザインの原則はまだそのクラスに当てはまります。

さらに、今日はですが、明日はそれがThreadLocalであるか、インスタンス作成の制限がありません。クラスが通常の方法で設計されている場合、これらのアーキテクチャ上の選択肢の変更は非常に少ないです。静的フィールドを使用する場合、そのような変更は、フィールドを非静的にするために、より多くのメンテナンス作業を必要とします。

+0

なぜインスタンス変数ですか? – Andreas

+0

@アンドレアスは理由を編集する編集を参照 – Bohemian

関連する問題