[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 10173] String クラスは flyweight ?



小滝 です。

02/06/01 の古橋 さんのメールの中で下のような記述があります:

> StringクラスはJavaの言語仕様のなかでも特殊でFlyweightというパターン
> を利用しています。

しかしこれは多少省略しすぎのように思います。結城 氏 のデザインパターン
のテキスト p.308 で Flyweightパターンの要約として:

”インスタンスを出来るだけ共有させて無駄に new しない”

とあります。しかしこれはFlyweight の一面を言っているに過ぎません。

Gamma の原著では上記(と同様)の記述に引き続き下のような記述があ
ります:

”ここで重要な概念(key concept)はintrinsic状態と extrinsic状態の
  区別である。intrinsic状態はflyweightの中に保存されflyweightの
  コンテキスト(実行環境)とは独立であり全てのオブジェクトにおいて
  共有される。これに対してextrinsic状態はコンテキストに依存しオブ
  ジェクト間で(一般に)共有することは出来ない。”

従って Flyweight パターン(を持つ)クラスとはデータ構造としての
2面性、つまりintrinsic状態(不変部分)と extrinsic状態(可変部分)
を持つもの(あるいはその振舞いが影響を受けるもの)、として定義され
ています。

ということで、String クラスを Flyweightパターン(を持つクラス)と言う
のは多少省略し過ぎのように考えますがいかがでしょうか?
-------------------------------------------------------------------
それから以下は蛇足ですが・・・。

equals() と == をどのように使い分けるかということが議論されています。
議論の焦点は 処理速度 と 判定結果不定 のトレードオフをどのように
考えるかということのようです。

しかし実用的には下のようなコーディングスタイルで充分だと思いますが。

 if(A == B || A.equals(B)) {
     ........
 } else {

 }