- - PR -
ユーティリティクラスをSingletonにしたときのデメリット
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-06-24 19:42
Singletoneのメリットは言われている通り
だとは思いますが、私は個人的に使い分け は以下のような観点で行ってますね。 ・Utility的クラスはstaticクラス ・Factory的クラスはSingletone Utilityクラスでいちいちインスタンス取得 するためにHoge.getInstance()とか面倒です しね。 | ||||||||
|
投稿日時: 2005-06-24 20:51
拡張しようとしまいとユーティリティにシングルトンという発想自体が私にはないですし、使いたくもないです。シングルトンは数を制御したいためのデザインパターンですから。
シングルトンの活用事例としては、コネクションプーリングがよくあがりますね。 でも、そもそもあなたと私でユーティリティの定義が違うのかもしれません。 | ||||||||
|
投稿日時: 2005-06-24 23:16
public staticなメソッドであればstatic importが利用できるので、今では特別な理由がない限りはstaticなんでしょうね。
| ||||||||
|
投稿日時: 2005-06-25 00:18
はじめに、回答ではありません。ごめんなさい。 私の勉強不足です。 理解できません。 拡張と聞くと、継承を使った拡張を想像してしまいます。 Singletonで作ったクラスのコンストラクタはprivateですよね。 そうすると、継承は使えないと思うのですが・・・ Singletonで作ったクラスの拡張性とは、どんな点でしょうか? | ||||||||
|
投稿日時: 2005-06-27 12:58
Singletonってサブクラス化できたんですね。
Googleに教えてもらいました。 失礼しました。 | ||||||||
|
投稿日時: 2005-06-30 12:22
クラス設計に関するメモ->Singletonパターンを使うときの注意
http://homepage3.nifty.com/satoshis/oo/memo.html#singleton 上記で扱っているのはGOF本のSingletonパターンのデメリットです。世界中、 どこにいっても通用する「Singletonパターン」は"GOF本のSingletonパターン"です。 Singletonのサブクラス化(結城浩氏著->Java言語で学ぶデザインパターン入門) http://www.hyuki.com/techinfo/singleton.html 上記で解説しているのはSingletonパターンの問題点である継承不能を回避するために 改良したパターンで「Singletonパターン」の"改良版"です。 これを「Singletonパターン」といっても大概の場合、話は噛み合いません。GOF本の 「Singletonパターン」が"一般に認知されている「Singletonパターン」"ですから。 ユーティリティクラスのstaticメソッドでの作成がユーティリティクラスのsingleton パターンによる作成よりも優れている点はユーティリティクラスのインスタンスが 生成されない、生成する必要がない点です。 ユーティリティクラスをsingletonパターンで作成した場合、常にgetInstanceメソッド でインスタンスを取得してからそのメソッドを呼び出す必要があり、コードが 冗長になる可能性があります。[また、インスタンス取得用の変数を定義して、 getInstanceメソッドの記述を忘れて、インスタンス取得用の変数.メソッドと記述しても コンパイルは通り、実行時にエラーがでるまで記述ミスに気づかないかもしれないので バグの温床になりかねません。(取消し線が使えないので代わりに斜体にしておきます)] また、ユーティリティクラスをstaticメソッドで作成した場合、staticメソッドを 呼び出すだけなのでSingletonパターンで作成する場合よりも短いコーディング量で すみます。 [ メッセージ編集済み 編集者: asip 編集日時 2005-06-30 15:51 ] | ||||||||
|
投稿日時: 2005-06-30 12:52
これって、
こんなコードですか? 本当にコンパイル通りますか? こんなのが「バグの温床」になり得ますか? 変数がインスタンス変数であれば通るでしょうが、シングルトンオブジェクトをインスタンス 変数で保持する意味はないですよね。 | ||||||||
|
投稿日時: 2005-06-30 15:32
上記のコードで※行を省略した場合、実行時にNullPointerExceptionになります。 ユーティリティ系のクラスは一つのメソッドの中で何度も呼ぶケースが 多いので、Singelton系ユーティリティのgetInstance()はコンストラクタ で呼んでインスタンス変数に参照を格納し、各メソッド中ではそのインスタンス 変数でメソッドを呼び出しています。 各メソッドで変数定義し、getInstance()するよりは見た目がすっきりし、 コード量も減ると思います、特にSingleton系ユーティリティが一つのクラスで 幾つも呼ばれる場合には。 ほとんどの場合、Singletonパターンでのユーティリティクラスの作成・その 使用ではなくStaticメソッドでのユーティリティクラスの作成・その使用を行うので、 上記のようなコードをユーティリティクラスの呼び出しで書くことはまずありませんが。 言われてみると上記のようなコードを書く人は少ないと思うので、修正は しておきます。
[ メッセージ編集済み 編集者: asip 編集日時 2005-06-30 16:31 ] |