2009-05-27 4 views
2

C++では、テンプレートを使用してシングルトン基底クラスを作成できることを理解しています。これはAndrei Alexandrescu著のModern C++ Designの本に書かれています。Javaの一般化されたシングルトン基底クラス

Javaでこれを実現できますか?

+1

なぜあなたはそれをしたいですか?シングルトンは基本的に反パターンですね。 –

+1

1つの理由は、未知のクラスのインスタンスをどのようにインスタンス化するかを知りたいという理由があります。言い換えれば、クラスメイトとして与えられたこのような: オブジェクトインスタンス= clazz instanceofシングルトン? (シングルトン)clazz.getInstance():新しいclazz(); (これはもちろん、パラメータのないコンストラクタを使用する必要がありますが、これは別の問題です)。 – n3rd

+3

@Elvian:すべてのものと同様、シングルトンは良い時には良い、そうでない時には良いことではありません。優れたプログラマーであることの一部は、問題が収まらない場合に、パターンと既存のソリューションを適用しない時期と時期を知ることです。言い換えれば、それが適切にそれを適用するときを知らないとき、それはシングルトンのせいではありません。 – Welbog

答えて

3

私はまだJavaでこれについて満足のいく解決策を見ていません。 C++のテンプレートや.NETのジェネリックスを使用する例はたくさんありますが、Javaのジェネリック実装では、これを困難にする静的メンバーにはいくつかの制限があります。

私が見てきた最良の選択肢は、静的なHashMapとファクトリクラスを使用することです。これにより、任意のクラスの複数のSingletonを処理できる単一のファクトリを作成できます。

実装については、this postを参照してください。

+0

(またはその他):「この投稿」は最新ではありません。私は本当にそのリンクが必要です。 : -/ – AudioDroid

2

はい、すべてのアプローチには欠陥があります。彼らは高価である(​​を使用)か、テストを不可能にする(final static)。

は右へのリンクを参照してください。

"芸術の状態は、" コンテナを使用することですか工場のc必要に応じてシングルトンを再生成し、ある種のキャッシュに保持します。春、Guiceなどを参照してください。

3

Javaのジェネリックは改革されていないため、同じように一般化されたシングルトンを実装することはできません。ジェネリック型はコンパイルされたコードから "消去"されるため、実行時にシングルトンを明示的に初期化する必要があります。

結論は、シングルトンのテンプレートはJavaではあまり価値がないということです。

+0

ジェネリックが改訂されたとしても、言語に他の変更を加えなければ、それでも機能しません。例えば、静的は同じクラスのすべてのパラメータ化によって共有されます。 –

+0

Revisedジェネリックでは、クラスメンバー変数を見つけるための実際の型を反映した実装を想像することができます。私は推測するかもしれないが、私はメタ・スペキュレーションで線を描くべきだと思う。 – erickson

1

1997年に私はJDK 1.0.2でこれを試み、継承可能なシングルトンを作ることができなかったという結論に達しました。私ができる限り、Javaにはこれを可能にする新しい機能はありませんでした。

しかし、これを手動で行うには、多くの定型コードは含まれていません。クラスごとに10行程度のコードが含まれています。何らかの種類の匿名のファクトリメカニズムを作成する必要がある場合、シングルトンはインスタンス化プロトコルのプレースホルダとのインタフェースを実装できます。

+0

良いシングルトンは3行のコードです。クラス宣言、インスタンス宣言と初期化子、およびプライベートコンストラクタ。 – erickson

関連する問題