- - PR -
singletonとクラス変数とインスタンス変数
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-11-02 10:41
今回の件でのあすかさんの結論は出ているようですが、
基本はかつのりさんの言うようにモデリングの観点から決めるにつきるかと。 ただ、シングルトンで実装されたクラスがシリアライズ可能な場合は、 簡単にインスタンス数をコントロールされてしまうので注意が必要です。 まあ、デシリアライズされた時点でシングルトン特性を失っていますので、 他の部分で破綻してしまうでしょうけど。 今回の場合は「唯一の変数としたい」が命題のようですので、 微力ながらクラス変数にする理由の一つにならないかな? | ||||
|
投稿日時: 2006-11-02 11:17
余談になりますが、シングルトンは簡単に破綻します。
1つのVMに対してではなく、1つのクラスに対して1つのインスタンスだからと言う理由ですが、 クラスローダの分だけクラスを作ることが出来る=インスタンスも複数となります。 どうしても一意性を保障する事は出来ませんので、 アプリケーション側の作法も必要となってきます。 ですので、無理やりにでも一意にする方法にこだわって static/非staticにするかを考えるよりも、 モデリングの観点で設計することが重要となります。 | ||||
|
投稿日時: 2006-11-02 11:20
VM的にはクラスローダが違うと別のクラス扱いだから構わない気もしますが。 クラスローダ違いのクラスを同じクラスだと混同してしまうケースは多いですが | ||||
|
投稿日時: 2006-11-02 11:44
>nagiseさん
例えば、Javaのドメイン外のリソースを掴むとか・・ こんなの言ってしまえばキリがないのですが シングルトン=唯一ではないと言うことだけでも伝わればいいかなーと。 | ||||
|
投稿日時: 2006-11-02 11:58
読み取り専用のファイルとかだとできなくはないですねぇ。(笑)
あとは・・・システム動作開始当初にロックをかけてしまうテーブルとか? 考えただけでも嫌だな(苦笑) _________________ | ||||
|
投稿日時: 2006-11-02 14:29
>private final boolean 面; 上記のインスタンス変数をクラス変数に変更出来ますか?っと言うことです。 つまり、Singletonパターンにおいても、インスタンス変数とクラス変数は同義では無いと。 | ||||
|
投稿日時: 2006-11-02 15:20
そうですね、指摘されて気づきましたがTypesafeEnumパターンはSingletonパターンを含んでいるのではないでしょうか? | ||||
|
投稿日時: 2006-11-02 15:42
TypsesafeEnumの狙いはJavaSE 5 以前のバージョンのJavaで 「列挙型を実現すること」を目的としていますが、 その実現にはSingletonを利用しているといったところでしょうか。 (Flyweightパターンのようにも取れますけどね) ただ、「含んでいる」という表現は微妙で、 TypsesafeEnum extends Singleton のような意味合いで誤解されかねないので気をつけたほうがいいとは思います。 TypsesafeEnumでは列挙を表す値を単一に保ちたいわけですし (equals()ではなく==で比較できるようになる) 値は不変である必要があるというところで工夫が必要なのでしたね。 |