イントロダクション
前回は「dirコマンド」を実装しました。オプションとかは実装してませんが…
配列の使い方
Listについてやりますが、一応までに「配列はこんな感じ」というものを作成したので記載しておきます。
とりあえずは「コマンドを実行」という目的を達成する事が出来たので良しとします。
Listを使う
リストインターフェースなどに関してはこちらの記事を見ていただきたく思います。
今回はこのListを使ってコマンド履歴を作る事にします。今回はリストをフィールド変数にする事でアプリが起動している間データを保持する様にします。
現状の設計
はじめに、アプリを起動したら、コマンドの入力待ちをします。
- 「hello」が入力された場合はコンソールに「Hello World」を表示
- 「計算式(四則計算)→1+1など」が入力された場合は、計算の結果をコンソールに表示
- その他の入力はエラーにして、プログラムを終了
変更後の設計
上の「その他〜」の部分から変更します。
- 「hello」が入力された場合はコンソールに「Hello World」を表示
- 「計算式(四則計算)→1+1など」が入力された場合は、計算の結果をコンソールに表示
- 「bye」と入力されたらコマンドの履歴を表示してアプリを終了する
- その他の入力はエラー出力をして次の入力待ちを行う
実装
変更したところは「byeと入力されたら〜」の部分を追加しただけです。
なので、アプリが終了した時に入力されたコマンドの一覧をコンソールに出力する処理を実装します。
具体的に
入力されたコマンドは保持する必要があります。「登録する」とか「保存する」というのはDBやファイルに保存してアプリが終了してもそのデータが保存されることを指します。「保持する」というのはアプリケーションが起動している間など、一時的に保存することを指します。
その簡単な方法として「フィールド変数」を使用する方法がります。
フィールド変数
フィールド変数は下のようにクラスの中に記載します。
ちなみに下のクラスは「人間」を表すクラスを作成しました。
クラスとは
フィールド変数とメソッドを持っている、カプセル化されたオブジェクトです。
人間クラス
public class Human { /** 名前 */ private String name; /** 年齢 */ private int age; /** 身長 */ private int tall; /** コンストラクタ */ public Human() { name = "デーモン閣下"; age = 10040; tall = 160; } public void greet() { int num = 0; System.out.println("私は" + name + "と申します" + "年齢は" + age + "、身長は" + tall + "cmです"); num = 10; System.out.println("num: " + num); } public void count() { int num = 0; num = 10; age++; System.out.println("num:" + num + " / age: " + age); } }
処理内容
- コンストラクタでフィールド変数に値を設定します
- greet()で挨拶をします
このような形でフィールド変数を使用します。
実際に動かすとき
Javaプログラムを起動するのはメインメソッドなので、下のように実装します。
public class Main {
public static void main(String[] args) {
Humain man = new Human();
man.greet();
}
}
処理内容としては、Humanクラスをインスタンス化(new)して「greet()」メソッドを呼び出す。
これだけです。上記のクラスに「new」したときの処理=コンストラクタと「greet()」メソッドが定義(実装)されているので
メインメソッドからは呼び出すだけです。
- 「呼び出す」というのは「man.greet()」と書いている部分のことです。
- 「定義されている」というのは「greet()」メソッドが実装済みということです。
スコープ
ここで「スコープ」という言葉について記載したいと思います。この言葉は「変数の寿命」を意味します。上のコードで行くとフィールド変数はクラスのインスタンスがある間ずっと生きている変数になります。
具体的には下のコードでHumanクラスを実行した時にローカル変数「num」はメソッドが動いている間だけ生きている変数です。なのでクラスの中でiint num;
というコードが複数あってもビルドエラーにはなりません。
public static void main(String[] args) { Human human = new Human(); human.greet(); human.count(); human.greet(); }
このように処理を行った時、1回目のgreet()で「age」は10040と表示されますが、2回目は「10041」と表示されます。
対して「num」は何回実行しても「10」のままです。
スコープにより変数の寿命が違うのでこのような違いが出ます。
コマンドの一覧
実装方法に関してはこれまでに記載したので、作成したコードと実行結果を載せます。
サンプルコードはGitに揚げてあります。
そして、起動結果です。
でわでわ。。。