標準入力からboolean値を取得するユーティリティを作る

スポンサーリンク

boolean型の基本データは真偽を表します。「真実」trueまたは「虚偽」falseです。ユーザーから頻繁に受け取る「はい」「いいえ」はboolean値として扱うため前回までと同様にこれも標準出力から取得するメソッドを実装します。

標準入力から文字列を取得する
標準入力から文字列を取得するユーティリティを作る
標準入力からint型整数を取得するユーティリティを作る
標準入力からint型整数を範囲指定で取得するユーティリティを作る

仕様を決める

まず処理を詰める前に何を真とするか、何を偽とするかを決めます。booleanにもintと同じように文字列からの変換メソッドがあります。

boolean b = Boolean.parseBoolean("true");

ただしtrueにするには文字列”true”しか受け取れません。この4文字のどの文字も大文字でも小文字でもかまいませんが例えば”treu”とか”truee”など少しでも違うだけでfalseの扱いにされます。これは変な文字がきたら例外を投げるint型から文字列の変換と比較すると少しゆるい実装です。trueまたはfalseでユーザに入力してもらってもこのようなちょっとした打ち間違いでtrueとなるべきところがfalseとして認識されてしまう可能性があります。

ということでユーザーにはtrueの場合には”y”または”yes”、falseの場合には”n”または”no”と入力してもらうようにします。それ以外の場合には警告メッセージを出力して入力し直してもらうようにします。大文字小文字はどちらもありとします。

メソッドのインタフェースと処理を決める

仕様が固まったらインタフェースを決めます。インタフェースinterfaceとはある部品をつなぐ時につなぎ目がどうなっているか明らかにすることです。例えば電球とソケットはお互いのインタフェースが決まっているので私たちは困ることなく電球を交換できるのです。ここではメソッド名、引数、戻り値をインタフェースと考えます。

  • メソッド名はreadBoolean
  • 引数は入力を促すメッセージ
  • 戻り値は取得したboolean値

処理の流れは以下の通りです。

  • 引数から受け取ったメッセージを出力する。
  • 文字列を取得する。
  • 小文字に変換する
  • 文字列がyまたはyesの場合にはtrueを返しメソッドを抜ける
  • 文字列がnまたはnoの場合にはfalseを返しメソッドを抜ける
  • それ以外の場合は警告メッセージを出力して先頭に戻る。

小文字に変換するのは「大文字小文字どちらもあり」という仕様に対応しています。小文字に変換してから小文字と比べることで「どちらもあり」を実現しているのです。

実装する

ここまで決めたら実装をします。処理をもとに実装しているだけなので慣れるとそれほど困ることはないはずです。和文Java訳をするといったところです。

  /**
   * 標準出力からboolean値を取得する
   * @param message
   * @return 
   */
  public boolean readBoolean(String message) {
    while(true){
      //メッセージを出力
      out.print(message + ": y(es) or n(o)>");
      //入力を取得する
      String str;
      try{
        str = in.readLine();
      }catch(IOException e){
        //例外発生時にはメッセージを出力してやり直す
        out.println(e.getMessage());
        continue;
      }
      //小文字に変換
      str = str.toLowerCase();
      //yかyesの場合はtrueを返す
      if(str.equals("y") || str.equals("yes")){
        return true;
      }
      //nかnoの場合はfalseを返す
      if(str.equals("n") || str.equals("no")){
        return false;
      }
      out.println("入力が正しくありません。");
    }
  }

実行するmainメソッドも作ります。こちらは前回までに作った名前と誕生月を取得する処理を利用しています。入力した内容を確認して(仮想ですが)登録する、という動作をします。

一度なにかを処理してから判定するループを作るにはdo-while文を使うのがよいです。whileの( )の中にはboolean値で処理の続行を継続するための条件を設定します。ここではユーザーによるboolean値の入力を利用しています。「いいえ」の場合のみ継続するので!を使ってboolean値を否定、つまりtrueとfalseを逆にします。これで「はい」の時にはwhile文を抜けて登録処理に進めようになります。

  public static void main(String[] args){
    TerminalUtil terminalUtil = new TerminalUtil();
    String name;
    int month;
    do{
      name = terminalUtil.readString("名前を入力してください。");
      month = terminalUtil.readInt("誕生月を入力してください。", 1, 12);
      System.out.println("あなたは" + month + "月生まれの" + name + "さんですね。");
    }while(!terminalUtil.readBoolean("登録してよろしいですか?"));
    //ここに登録する処理を後で追加する。
    System.out.println("登録完了しました。");
  }

では実行します。各所でわざと入力ミスをしています。また一度目は「いいえ」を入力しやり直ししています。

名前を入力してください。>ベルジェ
誕生月を入力してください。>8
あなたは8月生まれのベルジェさんですね。
登録してよろしいですか?: y(es) or n(o)>n
名前を入力してください。>ベルジェ
誕生月を入力してください。>
数字ではありません。
誕生月を入力してください。>7
あなたは7月生まれのベルジェさんですね。
登録してよろしいですか?: y(es) or n(o)>
入力が正しくありません。
登録してよろしいですか?: y(es) or n(o)>yes
登録完了しました。

標準入力からオプション選択を取得するユーティリティを作る

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

%d人のブロガーが「いいね」をつけました。