- uk
- ぬし
- 会議室デビュー日: 2003/05/20
- 投稿数: 1155
- お住まい・勤務地: 東京都
|
投稿日時: 2003-09-04 17:33
| 引用: |
|
「どこからでも呼び出せる」というのはつまりグローバル変数と変わらないわけで
確かに一見便利ではありますが、スパゲッティなコードの要因になります。
|
この場合は「変数」ではなく、扱いとしては「定数」です。使用するクラスからデータの
更新を行うのであれば、もちろん同じようには扱えません。
| 引用: |
|
また、単純なSingletonはクラス単位(ClassLoader単位)でしか管理できないので
例えば、複数のWebApplicationから利用するためにServerのlibディレクトリ
(TomcatだとCATALINA_HOME/common/lib)などに配置すると、Application間でも
共有されてしまい、破綻します。
|
破綻する、というのはなぜですか? そういう場所に配置して、しかも複数のアプリケーション
が使う、ということはそういう設計にしているのでは? そうでないのなら、設計がおかしいと
思いますが。
| 引用: |
|
こういうのをSingletonというのかどうかはわかりません。
自分以外にこういうパターンをあまり見たことがないのですが、
使っている人はいらっしゃらないんですかね。
なにか問題があるんでしょうか?
|
前の私の書き込みは答えにならないでしょうか。
#もっともセッションごとの情報はSessionオブジェクトに格納するのが普通だと思いますが
|
- おっきー
- 大ベテラン
- 会議室デビュー日: 2003/05/01
- 投稿数: 104
|
投稿日時: 2003-09-04 19:00
| 引用: |
|
kitoさんの書き込み (2003-09-02 13:35) より:
Webアプリケーション単位のキャッシュであればServletContextに
保存する方が良いと考えます。
また、単純なSingletonはクラス単位(ClassLoader単位)でしか管理できないので
例えば、複数のWebApplicationから利用するためにServerのlibディレクトリ
(TomcatだとCATALINA_HOME/common/lib)などに配置すると、Application間でも
共有されてしまい、破綻します。
|
共有されることが気持ち悪いかもしれませんが、破綻の原因にはならない思います。
| 引用: |
|
で、私は以下のようなパターンを良く使います。
Session単位に一つのインスタンスが欲しいときには
public static SessionSingleton getInstance(HttpSession session) {
SessionSingleton ss = (SessionSingleton)session.getAttribute(KEY);
if (ss == null) {
ss = new SessionSingleton();
session.setAttribute(KEY, ss);
}
return ss;
}
//利用側
SessionSingleton singleton = SessionSingleton.getInstance(session);
WebApplication毎に一つのインスタンスを使う場合は
getInstanceの引数をServletContextにします。
|
私も良く使います。Singltonパターンではありませんが、要は
初期化用のユーティリティメソッドから常にインスタンスを取得しているわけですね。
Webアプリケーションにしか使えないクラスになってしまうのが気持ち悪いので
Singltonで問題ないものはSingltonで実装したほうがいいのではないかと思います。
キャッシュの更新も考えないといけないですしね。
初期化の処理は、あまり複雑にしないほうがいいと思います。
個人的な意見ですけど。
|
- TK
- 常連さん
- 会議室デビュー日: 2002/08/13
- 投稿数: 42
|
投稿日時: 2003-09-05 19:45
皆様、大変に参考になりました。
かなり迷いましたが、
結局、シングルトンで実装し、Plugin内で最初にDBに接続するという
ことにしました。
ありがとうございました。
|