2017-01-10 14 views
1
public class DBSingleton { 

private static DBSingleton instance = new DBSingleton(); 

private DBSingleton() { 
// why do we need this constructor 
} 
public static DBSingleton getInstance() { 
    return instance; 
} 
} 

プライベートコンストラクタが私を助けることができますか?シングルトンのプライベートコンストラクタ

私はすべての変数とメソッドが静的であり、コンストラクタをpublicにしても何も変更しないことを意味します。
このクラスの中のすべてがオブジェクトではなくクラス自体に関連付けられていることを意味する静的なものなので、誰かが私のシングルトンのオブジェクトを作成するとは何も起こりません。 Java静的プロパティはすべてのオブジェクトに共有されます。

誰もがあなたのクラスをインスタンスからユーザーを防ぐために、プライベートコンストラクタを必要とする

+0

まず、シングルトンは必ずしも静的なクラスとして実装する必要はありませんメソッド。次に、オブジェクト作成自体が重い場合(CPU /ネットワーク/ etc)、作成されたインスタンスの数を制御する必要があります(例:connection-poolなど)。 – alfasin

+2

あなたのコンストラクタがpublicであれば誰でもそれを呼び出すことができるので、シングルトンの他のインスタンスを作成することができます。複数のインスタンスを作成することが問題ではない場合は、まずそれをシングルトンにするのはなぜですか?すべてが静的であれば、なぜ1つのインスタンスを作成するのですか? –

+0

これはシングルトンでさえありません.'instance'は 'DBSingleton'のインスタンスを作成せずにアクセスできません。このインスタンスはコンストラクタがプライベートであるため実行できません。あなたはおそらく 'public static DBSingleton getInstance()'を意味します – Paul

答えて

0

私に合理的な例を与えることができますしてください。

コンストラクタをパブリックにすると、ユーザはDBSingleton singleton = new DBSingleton()となり、クラスはシングルトンになりません!

+0

ええ、javaのstaticプロパティがすべてのオブジェクトに共有されているため、あまり変更されません。すべてのフィールドが静的として宣言されているため、ユーザーがDBSingleton singleton = new DBSingleton()を行っても、同じフィールドにアクセスします。私は正しい? –

+0

@ M.T no。すべてのフィールドとメソッドが静的である場合、シングルトンを作成する際には何のポイントもありません。クラスの静的メンバーにアクセスするためのインスタンスはまったく必要ありません。だからそれをシングルトンにすることは非常に混乱させ、理解の欠如を示しています。コンストラクタをprivateにし、getInstance()メソッドを提供しないと、クラスをインスタンス化しないでください。 –

+0

* "すべてのフィールドは静的として宣言されています" *これはJavaでの移動方法ではありません。 Javaはオブジェクト指向言語なので、オブジェクトを使用して、多態性と抽象化の恩恵を受ける必要があります。それが「過剰」だと思うなら、なぜJavaを使っているのですか?そこにはOO以外の言語がたくさんあります... –

0

シングルトンクラス(編集:シングルトンインスタンスと比較)は、必ずしもインスタンス化する必要はありません。プライベートなコンストラクタを与え、他のすべてのメソッドを静的に宣言し、ユーザがそれらをクラスで呼び出すようにするだけで十分です。

コンストラクタは、インスタンスを1つ作成するかどうかにかかわらず、クラスがシングルトンであることを保証するためにプライベートである必要があります。プライベートコンストラクタが宣言されていない場合、Javaは自動的に引数なしのコンストラクタを提供します。

安全性のために、つまりシングルトンが言っていることとまったく同じ方法でメソッドを呼び出す場合には、クラスは単一のインスタンスにする必要があります。明示的にシングルトンを作成していないクラスのインスタンスがある場合、シングルトンの実装を実行しているメソッドを呼び出すときには保証されません。実際には、前記メソッドがオーバーライドされたDBSingletonのサブクラスがあるかもしれません。クラスを宣言する

より適切な方法:(

DBSingleton dbsInstance = DBSingleton.getInstance(); 
// ... all sorts of code, some of which might affect dbsInstance 
dbsInstance.someMethod(); 

全てのベットがオフになっている。あなたはDBSingleton.someMethod()としてそれらを呼び出す場合は、これをやっている場合は、当然予想される動作を取得しますが、)他の例を避けるために、それを最終的に宣言することです。プライベートなコンストラクタを与えて、インスタンス化することもできません。 (最終クラスまたはプライベートコンストラクタを持つクラス(または非プライベートコンストラクタがゼロである)のいずれでも十分です。

+0

可能なインスタンスがゼロで静的なクラスメソッドは正常ですが、間違いなくシングルトンではありません。 –

+0

@JBNizetユーザーはクラスとしてのみ(インスタンスとして)使用でき、同じクラスの複数のインスタンスを作成できないという意味でのシングルトンです。 – alfasin

+1

さて、いいえ、クラスのインスタンスと同じ方法でクラスを使用することはできません。静的メソッドしかない場合は、インターフェイスを実装する方法はありません。抽象クラスを拡張する方法はありません。とにかく、シングルトンは "ユーティリティクラス"とは異なる正確な意味を持っていますか?他の単語に1つの単語を使用しても、混乱以外は発生しません。 –

関連する問題