メールの詳細(トピック表示)
入門本 Memento について
投稿者: さん 2001/11/01 09:55 MLNo.1130 [メール表示]
村山といいます。
いつもお世話になっております。
結城さんの「Java言語で学ぶデザインパターン入門」の
第18章 Mementoパターン において質問があります。
もし過去に同じ投稿があったら申し訳ありません。
現在,上記の本を教材にしたデザインパターンの勉強会
に参加しています。
Mementoのサンプルプログラムを実行したところ,
次のような出力が得られました(長いので本メール末尾に記します)
25番で復帰したときの,フルーツがおかしくなっています。
以下,私の考えを述べます。
本の274ページの下のほうに restoreMementoメソッドがありますが,
このメソッドの
this.fruits = memento.fruits;
が問題なのではと思います。
一度 restoreMementoが呼ばれてしまうと,
this.fruits と memento.fruits に参照が張られてしまい,
次に createMemento()が呼ばれるまで,this.fruits に
フルーツを追加すると,memento.fruits にも追加されてしまいます。
解決策はいろいろありますが,以下が一番適当かなと思っています。
いかがでしょう。
1,GamerクラスのrestoreMementoメソッドを次のようにする。
public void restoreMemento(Memento memento) {
this.money = memento.money;
this.fruits = memento.getFruits(); //変更
}
2,MementoクラスにgetFruitsメソッドを追加する。
Vector getFruits() {
return (Vector)fruits.clone();
}
-------------------------------------------
↓↓↓↓↓プログラム修正前の出力ログ↓↓↓↓↓
-------------------------------------------
==== 17
現状:[money = 350, fruits = [おいしいリンゴ]]
所持金が増えました。
所持金は450円になりました。
(だいぶ増えたので、現在の状態を保存しておこう)
==== 18
現状:[money = 450, fruits = [おいしいリンゴ]]
フルーツ(おいしいバナナ)をもらいました。
所持金は450円になりました。
==== 19
現状:[money = 450, fruits = [おいしいリンゴ, おいしいバナナ]]
フルーツ(おいしいバナナ)をもらいました。
所持金は450円になりました。
==== 20
現状:[money = 450, fruits = [おいしいリンゴ, おいしいバナナ, おいしいバナナ]]
所持金が半分になりました。
所持金は225円になりました。
==== 21
現状:[money = 225, fruits = [おいしいリンゴ, おいしいバナナ, おいしいバナナ]]
所持金が半分になりました。
所持金は112円になりました。
(だいぶ減ったので、以前の状態に復帰しよう)
==== 22
現状:[money = 450, fruits = [おいしいリンゴ]]
所持金が半分になりました。
所持金は225円になりました。
==== 23
現状:[money = 225, fruits = [おいしいリンゴ]]
フルーツ(おいしいぶどう)をもらいました。
所持金は225円になりました。
==== 24
現状:[money = 225, fruits = [おいしいリンゴ, おいしいぶどう]]
所持金が増えました。
所持金は325円になりました。
==== 25
現状:[money = 325, fruits = [おいしいリンゴ, おいしいぶどう]]
所持金が半分になりました。
所持金は162円になりました。
(だいぶ減ったので、以前の状態に復帰しよう)
==== 26
現状:[money = 450, fruits = [おいしいリンゴ, おいしいぶどう]]
フルーツ(おいしいバナナ)をもらいました。
所持金は450円になりました。
---------------------------------------
横河システムエンジニアリング(株)
生産情報ソフトウェア部1課:村山 智之
murayama@…
TEL:0422-52-6314 内線:731-20165
FAX:0422-52-0611
---------------------------------------
読み込み中...-
MLNo.1132
結城浩さん
(0) 2001/11/01 20:59 [メール表示する]

村山さん、結城です。
> 本の274ページの下のほうに restoreMementoメソッドがありますが,
> このメソッドの
> this.fruits = memento.fruits;
> が問題なのではと思います。
なるほど!
ご指摘の通り、これは問題ですね。
# 過去の思い出が現在の経験に侵食されてしまうわけですね。
> Vector getFruits() {
> return (Vector)fruits.clone();
> }
この修正も動作確認しました。
貴重なご指摘感謝します。
- - - - -
以下余談。
mementoという映画があるようです。
題材はまさに「失われていく自分の記憶」です。
主人公は刺青を使ってcreateMementoするらしいです。
◆memento (映画)
http://www.otnemem.jp/
----
結城浩
http://www.hyuki.com/
http://www.textfile.org/
Pray without ceasing. (Bible, I Thessalonians 5:17)


