2010.05.06

【正誤情報】Javaデザインパターンハンドブック

Javaデザインパターンハンドブック

初版第1刷本文の記述に、以下のような間違いがありました。
お詫びして訂正いたします。

ページ
9
fig.1-3-1
「ITERATOR」の位置
「再利用性の組み込み」のレイヤー アスペクトの組み込み」のレイヤー
16
fig.1-4-1
右上部「実現」に関する噴出し内
EchoCommandによって実現 SleepechoCommandによって実現
16
fig.1-4-1
MyProcessorからMyCommandFactoryに伸びている破線 MyProcessorからMyCommandFactoryに伸びている破線矢印
45
List2-1-11
網掛けがpublic void execute();にかかる 網掛けがpublic void unexecute(); にかかる
58
List2-2-4
 

// 残り文字列の先頭がQuotedLiteralExp
// 閉じクォーテーションのインデックス
idx = currentText.indexOf(quotation, 1) + 1;
if (idx == -1) {
  throw new Exception(quotation + "が閉じていません。");
}
nextToken = currentText.substring(0, idx);
nextText = currentText.substring(idx);

 

 

// 残り文字列の先頭がQuotedLiteralExp
// 閉じクォーテーションのインデックス
idx = currentText.indexOf(quotation, 1);
if (idx == -1) {
  throw new Exception(quotation + "が閉じていません。");
}
nextToken = currentText.substring(0, idx+1);
nextText = currentText.substring(idx+1);

 

69
fig.2-2-9
abc,def,”123,xyz
java.lang.Exception: 構文エラーです。
–>,”123,xyz
予期せぬエラーが発生しました。
abc,def,”123,xyz
java.lang.Exception: “が閉じていません。
–>,”123,xyz
予期せぬエラーが発生しました。
82

List2-3-11

Random random = new Random(System.currentTimeMillis()); Random random = new Random();
82
List2-3-11
int num = random.nextInt(3) % 3; int num = random.nextInt(3);
95
List2-4-8
Random random = new Random(System.currentTimeMillis()); Random random = new Random();
95
List2-4-8
int num = random.nextInt(3) % 3; int num = random.nextInt(3);
170

List3-5-6

Random random = new Random(System.currentTimeMillis()); Random random = new Random();
170
List3-5-6
int num = random.nextInt(3) % 3; int num = random.nextInt(3);
278
fig.4-5-1
278
1段落目
 アンドゥは冒頭に「’」を付けて実行したコマンド(2番のbigecho ohoho)に対して有効なので、リクエスト番号は「2」に戻ります。  アンドゥは冒頭に「’」をつけて実行したコマンド(2番のbigecho ohoho)に対して有効なので、リクエスト番号は2に戻ります。ただし次に表示されるプロンプトメッセージのリクエスト番号はインクリメントされて3となっています。
278
2及び3段落目
 保存・復帰するアプリケーションの状態は、「次に割り振るべきリクエスト番号」です。アンドゥによって、この状態をアンドゥの対象となったリクエストに割り振られたリクエスト番号にまで戻すわけです。これを実現するためにMEMENTOパターンを適用します。
つまり、アンドゥの対象となりうるリクエストの発行時に、その時点でのリクエスト番号を格納したマメントを生成し、アンドゥ時にはアンドゥされたリクエストに対応するマメントからリクエスト番号を読み出
して「次に割り振るべきリクエスト番号」をその番号にまで戻すのです。
 保存・復帰するアプリケーションの状態は、「次に割り振るべきリクエスト番号」です。アンドゥによって、この状態をリクエストに応じたアクションの実行時点のリクエスト番号にまで戻すわけです。これを実現するためにMEMENTOを適用します。
つまり、アンドゥの対象となりうるリクエストに対応するコマンドの実行時点でのリクエスト番号を格納したマメントを生成し、アンドゥ時には、アンドゥされたリクエストに対応するマメントからリクエスト番号を読み出して「次に割り振るべきリクエスト番号」を読み出した番号にまで戻すのです。
278
No. 17の「正」の「アンドゥの対象となりうるリクエストに対応するコマンドの実行時点でのリクエスト番号」
注釈を追加:
バックグラウンド実行用のスレッドを使ってコマンドを実行するため、実際にはリクエスト発行時のリクエスト番号と、コマンドの実行時点のリクエスト番号が異なる場合があります。
293
List4-6-1
「public void execute() {」 以下
 

public void execute() {
  // コマンドクラスを動的に読み込んでコマンドを発行、実行する
  int index = request.indexOf(' '); // 最初の空白文字のインデックス
  String requestName
    = request.substring(0, index==-1 ? request.length() : index);
    // リクエスト名を切り出す。
    String commandClassName // コマンドのクラス名を合成する
    = requestName.substring(0, 1).toUpperCase() // 先頭を大文字に変換
      + requestName.substring(1)// 二文字目以降はそのまま
      + "Command";// 必ず"Command"で終わる
    Class c = null; // コマンドクラスを動的に読み込む
    try {
      c = Class.forName(commandClassName);
    } catch (ClassNotFoundException e) {
      // コマンドクラスが見つからない
      // 未知のリクエストとみなして標準エラー出力にエラーメッセージを表示
      System.err.println("Unknown request: "+request);
    }
      
    // Java Reflection APIを使って動的に読み込んだコマンドクラスの
    // コンストラクタを呼び出してインスタンス化を行い、コマンドを
    // 発行する。
    Command com = null;
    try {
      Constructor con
      = c.getConstructor(new Class[] { String.class, PrintStream.class });
      com = (Command)con.newInstance(new Object[] { request, console });
    } catch (Exception e) {
      // インスタンス化に失敗
      // 未知のリクエストとみなして標準エラー出力にエラーメッセージを表示
      System.err.println("Unknown request: "+request);
    }
      
    com.execute(); // 本物のコマンドを実行
  }
}

 

 

public void execute() {
// コマンドクラスを動的に読み込んでコマンドを発行、実行する
  int index = request.indexOf(' '); // 最初の空白文字のインデックス
  String requestName
    = request.substring(0, index==-1 ? request.length() : index);
    // リクエスト名を切り出す。
    String commandClassName // コマンドのクラス名を合成する
      = requestName.substring(0, 1).toUpperCase() // 先頭を大文字に変換
      + requestName.substring(1)// 二文字目以降はそのまま
      + "Command";// 必ず"Command"で終わる
      
    // Java Reflection APIを使って動的に読み込んだコマンドクラスの
    // コンストラクタを呼び出してインスタンス化を行い、コマンドを
    // 発行する
    Command com = null;
    try {
      // コマンドクラスを動的に読み込む
      Class c = Class.forName(commandClassName);
      // コンストラクタを呼び出す
      Constructor con
      = c.getConstructor(new Class[] { String.class, PrintStream.class });
      com = (Command)con.newInstance(new Object[] { request, console });
    } catch (Exception e) {
      // インスタンス化に失敗
      // 未知のリクエストとみなして標準エラー出力にエラーメッセージを表示
      System.err.println("Unknown request: "+request);
    }
      
    if (com != null) com.execute(); // 本物のコマンドを実行
  }
}

 

303
fig4-7-1
AbstractClass
#algorithm() #algorithm()
364
List5-3-1
 

  public abstract newDocumentBuilder(); // ファクトリメソッド

 

 

  public abstract DocumentBuilder newDocumentBuilder()
    throws ParserConfigurationException; // ファクトリメソッド