- PR -

singletonとクラス変数とインスタンス変数

投稿者投稿内容
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2006-11-02 10:41
今回の件でのあすかさんの結論は出ているようですが、
基本はかつのりさんの言うようにモデリングの観点から決めるにつきるかと。

ただ、シングルトンで実装されたクラスがシリアライズ可能な場合は、
簡単にインスタンス数をコントロールされてしまうので注意が必要です。
まあ、デシリアライズされた時点でシングルトン特性を失っていますので、
他の部分で破綻してしまうでしょうけど。

今回の場合は「唯一の変数としたい」が命題のようですので、
微力ながらクラス変数にする理由の一つにならないかな?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-11-02 11:17
余談になりますが、シングルトンは簡単に破綻します。

1つのVMに対してではなく、1つのクラスに対して1つのインスタンスだからと言う理由ですが、
クラスローダの分だけクラスを作ることが出来る=インスタンスも複数となります。

どうしても一意性を保障する事は出来ませんので、
アプリケーション側の作法も必要となってきます。

ですので、無理やりにでも一意にする方法にこだわって
static/非staticにするかを考えるよりも、
モデリングの観点で設計することが重要となります。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-11-02 11:20
引用:

かつのりさんの書き込み (2006-11-02 11:17) より:
余談になりますが、シングルトンは簡単に破綻します。

1つのVMに対してではなく、1つのクラスに対して1つのインスタンスだからと言う理由ですが、
クラスローダの分だけクラスを作ることが出来る=インスタンスも複数となります。



VM的にはクラスローダが違うと別のクラス扱いだから構わない気もしますが。
クラスローダ違いのクラスを同じクラスだと混同してしまうケースは多いですが
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-11-02 11:44
>nagiseさん

例えば、Javaのドメイン外のリソースを掴むとか・・
こんなの言ってしまえばキリがないのですが

シングルトン=唯一ではないと言うことだけでも伝わればいいかなーと。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2006-11-02 11:58
読み取り専用のファイルとかだとできなくはないですねぇ。(笑)
あとは・・・システム動作開始当初にロックをかけてしまうテーブルとか?
考えただけでも嫌だな(苦笑)
_________________
ぽん
大ベテラン
会議室デビュー日: 2003/05/13
投稿数: 157
投稿日時: 2006-11-02 14:29
引用:

あすかさんの書き込み (2006-11-02 09:42) より:
ぽん様がそのサンプルコードで何を言いたいのかがまったく分りませんが


>private final boolean 面;
上記のインスタンス変数をクラス変数に変更出来ますか?っと言うことです。
つまり、Singletonパターンにおいても、インスタンス変数とクラス変数は同義では無いと。
ぽん
大ベテラン
会議室デビュー日: 2003/05/13
投稿数: 157
投稿日時: 2006-11-02 15:20
引用:

nagiseさんの書き込み (2006-11-02 09:12) より:
なんだかTypesafeEnumを髣髴とさせるソースですね。


そうですね、指摘されて気づきましたがTypesafeEnumパターンはSingletonパターンを含んでいるのではないでしょうか?
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-11-02 15:42
引用:

ぽんさんの書き込み (2006-11-02 15:20) より:
そうですね、指摘されて気づきましたがTypesafeEnumパターンはSingletonパターンを含んでいるのではないでしょうか?



TypsesafeEnumの狙いはJavaSE 5 以前のバージョンのJavaで
「列挙型を実現すること」を目的としていますが、
その実現にはSingletonを利用しているといったところでしょうか。
(Flyweightパターンのようにも取れますけどね)
ただ、「含んでいる」という表現は微妙で、
TypsesafeEnum extends Singleton
のような意味合いで誤解されかねないので気をつけたほうがいいとは思います。

TypsesafeEnumでは列挙を表す値を単一に保ちたいわけですし
(equals()ではなく==で比較できるようになる)
値は不変である必要があるというところで工夫が必要なのでしたね。

スキルアップ/キャリアアップ(JOB@IT)