Back To Main

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃ ◆Javaで珈琲ブレイク vol.021 12/15/02◆
┃……………………………………………………………………………………………
┃ [不定期] まぐまぐ ID=0000088576 Melma! ID=m00061296
┃……………………………………………………………………………………………
┃ 今回からご覧になる方は、バックナンバーご活用下さい
┃ http://javacafebreak.tripod.com
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

◆目次◆

■BankUserInterface.java (1.0624)
■警告マーク
■補完機能 (Ctrl + スペース)
■コードを一括コメント (Ctrl + /)
■タスク・ウィンドウとエラー・提案マーク


皆さんこんにちは。

Mr.Hackです。

Eclipseは、うまくインストールできましたか?環境によっては、うまくいかない場合もあるようですね。僕もすべての環境をフォローできる訳ではありませんが、セットアップのお手伝いができればいいなと思っていますので、インストールがうまくいかない場合は、Java Cafe Roomの方へ投稿してください。そのときは、ご使用のOS名(バージョンまでわかればなおOK)、インストールしたフォルダ、インストールしているJava SDKのバージョン、インストールの過程を、最低明記していただけると、スムーズに、お手伝いできるかもしれません。

起動できた方はどうですか?ちょっといじっただけでも、便利そう、という感じがしたでしょうか?まだまだ、IDEのパワーはこれからですよ。

さっそく、そのパワーを少しずつみていきましょう。まずは、前回と同じように、クラスを新しく作成します(クラスの作成の仕方がわからない方は、前号、vol.020を参照ください)。クラス名は、BankUserInterfaceです。

そして、以下のBankUserInterface.javaをEclipseのBankUserInterfaceのテキストエディタ内に、コピー&ペーストしてください。

■BankUserInterface.java (1.0624)
━━━━━━━━━━━━ ここから ━━━━━━━━━━━━━━━━━━
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

/**
* コンソールベース・ユーザー・インターフェイス。
* Main()がユーザーインターフェイスのロジック・プロセスを担当。
* version 1.0624からパスワードをチェックし、適切ならメインメニューに進む。
* 簡略化のため、version 1.0624ではデータベース等のPersistencyは考慮していない。
* ユーザーからの入力がYesかNoかを判断するメソッドisContinued()がある。
*
* @author Mr.Hack
* @version 1.0624
* @since 1.0607
*/
public class BankUserInterface {

/**
* コンソールからの文字列がy、Y、n、Nかをチェックする。
*
* @return true ユーザーがnかNを入力した時
* false ユーザーがyかYを入力した時
* @exception IOException コンソールからの入力時例外が発生した時
* @since 1.0609
*/
private static boolean isContinued() throws IOException {
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String answer = buffer.readLine();
if (answer.equals("y") || answer.equals("N")) {
return false;
}
else if (answer.equals("n") || answer.equals("N")){
return true;
}
else {
System.out.print(" 入力が正しくありません。YかNを入力して下さい:");
}
}
}


/**
* コンソールベースのユーザーインターフェイスを実行するメインメソッド。
*
* <PRE>
* 1.メインメニューを表示する。
* 2.ユーザーがメニュー番号を選ぶと、各ロジック(預金・引き出し・残高参照・終了)を実行。
* 3.終了を選んだとき、プログラムが終了する。
* </PRE>
*
* また、メニュー番号以外をユーザーが選ぶともう一度適切な入力を促す。
*
*
* @param args コマンドライン引数。使用せず。
*/
public static void main(String[] args) {
System.out.println(" _________________________________________");
System.out.println("");
System.out.println(" 仮想バンキングへようこそ ");
System.out.println(" _________________________________________");
System.out.println("");


//コンソールからの入力ストリームを確立し、バッファーとして蓄えられるようにする
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));

boolean nextTransaction = true;
boolean printMenu = true;


// IOExceptionをまとめてキャッチする
try {

/**
* BankAccountの初期化
* 将来は、データベースや、データーを保存したファイルから、
* パスワード・データをここで読み込むことになる。
*/
String accountId = "Mrhack";
String password = "mRha9";
BankAccount bankAccountObject = new BankAccount();
bankAccountObject.setAccountId(accountId);
bankAccountObject.setPassword(password);

/**
* ユーザーが入力したパスワードをチェックする。当分の間は、
* シングルユーザーを想定しているので、アカウントがデーターに存在するかは、
* チェックせず、存在しているアカウントに対してパスワードをチェックする
*/
System.out.print(" パスワードを入力して下さい:");
for (int counter = 1;;counter++) {
String userPassword = buffer.readLine();
if (userPassword.equals(bankAccountObject.getPassword())) {
break;
}
else {
System.out.print(" パスワードが違います。もう一度入力して下さい:");
}
if (counter >= 3) {
System.out.println("");
System.out.println("");
System.out.println(" これ以上お取引出来ません。");
System.out.println(" ご利用ありがとうございました。");
return;
}
}

// isContinuedがtrueの間、ループする(ユーザーがEnterキーをタイプした場合はループ)
while (nextTransaction) {
if (printMenu) {
System.out.println(" _________________________________________");
System.out.println("");
System.out.println(" [1] 預金をする");
System.out.println(" [2] 引き出しをする");
System.out.println(" [3] 残高を参照する");
System.out.println(" [4] 取引を終了する");
System.out.println(" _________________________________________");
System.out.println("");
System.out.print(" ご希望のお取引番号をお選び下さい : ");
}

char choice = 0;

try {
choice = buffer.readLine().charAt(0);
}
// String#charAt()がスロー
catch (IndexOutOfBoundsException e) {
System.out.print(" 番号が正しくありません。もう一度入力して下さい:");
printMenu = false;
continue;
}
// BufferedReader#readLine()がスロー
catch (IOException e) {
throw e;
}

switch (choice) {
//預金ロジック
case '1':
int balance = (int) bankAccountObject.getBalance();
System.out.println("");
System.out.println(" あなたの現在の残高は" + balance + "円です");
System.out.println("");
System.out.print(" 預金額を入力して下さい: ");
// ユーザーが適切な数値(数値でマイナスではない値)を入力するまでループ
while (true) {
try {
// double型の値を取得。数値でない場合、NumberFormatExceptionをスロー
double depositAmount = Double.parseDouble(buffer.readLine());
bankAccountObject.deposit(depositAmount);
balance = (int) bankAccountObject.getBalance();
System.out.println("");
System.out.println(" " + (int) depositAmount + "円を預金しました");
System.out.println(" あなたの現在の残高は" + balance + "円です");
System.out.println("");
break; // 例外が発生しなければ、whileループを抜ける
}
// Double#parseDouble()がスロー
catch (NumberFormatException e) {
System.out.print(" 入金額が正しくありません。もう一度入力して下さい : ");
}
// BankAccount#deposit()がスロー
catch (IllegalArgumentException e) {
System.out.println("");
System.out.print(e.getMessage() + "もう一度入力して下さい : ");
}
// BufferedReader#readLine()がスロー
catch (IOException e) {
throw e;
}
}
printMenu = true;
break;
//引き出しロジック
case '2':
// do withdraw()
balance = (int) bankAccountObject.getBalance();
System.out.println("");
System.out.println(" あなたの現在の残高は" + balance + "円です");
System.out.println("");
// 考え方は、預金の時と同じ
while (true) {
try {
double withdrawAmount = Double.parseDouble(buffer.readLine());
bankAccountObject.withdraw(withdrawAmount);
balance = (int) bankAccountObject.getBalance();
System.out.println("");
System.out.println(" " + (int) withdrawAmount + "円を引き出しました");
System.out.println(" あなたの現在の残高は" + balance + "円です");
System.out.println("");
break;
}
catch (NumberFormatException e) {
System.out.print(" 引出額が正しくありません。もう一度入力して下さい : ");
}
catch (IllegalArgumentException e) {
System.out.print(" " + e.getMessage() + "。もう一度入力して下さい : ");
}
catch (IOException e) {
throw e;
}
}
printMenu = true;
break;
//残高参照ロジック
case '3':
// do get balance()
balance = (int) bankAccountObject.getBalance();
System.out.println("");
System.out.println(" あなたの現在の残高は" + balance + "円です");
System.out.println("");
printMenu = true;
break;
//終了ロジック
case '4':
System.out.println("");
System.out.print(" お取引を終了しますか?(終了:y/続行:n) : ");
//次の取引を続けるかどうかのフラグを設定
nextTransaction = isContinued();
printMenu = true;
break;
// 1, 2, 3, 4以外のキャラクタ
default :
System.out.print(" 番号が正しくありません。もう一度入力して下さい:");
printMenu = false;
}
}
}
catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
// BufferedReader#readLine()がスロー
catch (IOException e) {
System.out.println("不正な処理を行ったため、プログラムを終了します");
return;
}
finally {
// ストリームを閉じる
try {
buffer.close();
}
catch (IOException e) {
System.out.println("ストリームをクローズ出来ませんでした");
}
}
System.out.println("");
System.out.println(" ご利用ありがとうございました");
}
}
━━━━━━━━━━━━ ここまで ━━━━━━━━━━━━━━━━━━

このコードは、vol.012に出てきたものとにていますが、認証プロセスが加わっています。vol.012号作成する頃に、書き加えたものです。しかしながら、BankAccount.java (1.0821)もアップデートしているため、問題なくBankUserInterfaceクラスをコンパイルできるでしょうか?

どうです?ペースとして、Ctrl + Sで保存した後、何か異変はありませんか?

よーくみてください。エディタスペースの右側を。薄いピンク色の四角と、赤色の四角がそれぞれ一つずつ見つけられましたか(ビルド(コンパイル)していないと、うす色が2つ)?

何か、問題を警告しているようですね。


■警告マーク
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

まずは、一つ目のうすピンク色の四角をクリックしてみましょう。

最初のピンク色の四角をクリックすると、ソースコードの該当の問題箇所にジャンプします。赤く下線が引かれた行をなぞって左端まで行くと、エクスクラネーションマーク(びっくりマーク)が見つかると思います。その上にマウスを、ただ重ねてみましょう。そうすると、

┌──────────────────────────────────┐
コンストラクター BankAccount() は使用すべきではありません。
└──────────────────────────────────┘

これは、何を意味しているのでしょう?左の『パッケージ・エクスプローラ』ペインの中から、BankAccount.javaをクリックして、BankAccount()コンストラクタを探してみましょう。でもこの探し方では、IDEのパワーを実感できません。

BankUserInterface.javaの赤線が引かれている BankAccount()上を一回クリックまたは、ダブルクリックして(ダブルクリックするとBankAccountが反転するので、こちらの方が、確実)、右クリックしてサブメニューを開いてください。

そして、『宣言を開く』を選択すると・・・

どうですか?便利でしょ?BankAccount.javaのBankAccount()にジャンプしました。

ところで、どこが問題かといいますと、実は、@deprecatedタグを設定してあるために、警告が発せられたのです。@deprecatedタグは、javadoc超入門で、勉強しましたね。未だ習得していない方は、もう一度該当箇所をみてください(vol.009)。@deprecatedタグは、今までの古いバージョンを利用しているクライアントとの互換性を保ちつつ、新しくクラスを利用するユーザー(プログラマ)に、『推奨されていない』、言い換えますと、『時代遅れだから使うな』ということを警告するものでした。そのため、@deprecatedタグを含んだclassを使ってクライアントがコンパイルはできず、どうしてもコンパイルしたい場合は、-deprecationオプションを使わなければなりませんでした。

これを、簡単に解決するには、推奨されていないBankAccount()を使用しなければいいわけです。


■補完機能 (Ctrl + スペース)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

BankUserInterface.javaの赤線が引かれている new BankAccount()を書き換えましょう。さて、どのコンストラクタを使用しましょうか?あなたは、どのコンストラクタがあるか、BankAccount.javaクラスをクリックして確認しますか?いえいえ、もうあなたは、そんな面倒なことをする必要はないのです。そのかわりに、

赤線のnew BankAccount()を消して、

┌──────────────────────────────────┐
new b
└──────────────────────────────────┘

とタイプします。ここで、IDEのパワーの見せ所です。bとタイプした後、

┌──────────────────────────────────┐
Ctrl + スペース
└──────────────────────────────────┘

押してください。そうすると・・・。ポップアップメニューが出てきて、クラス等がリストアップされましたね。続けて、

┌──────────────────────────────────┐
a n k
└──────────────────────────────────┘

と入力してください。お、リストアップされましたね。BankAccountクラスが。しかも、
そのポップアップメニューの右側には、

┌──────────────────────────────────┐
『バンク預金口座クラス。・・・』
└──────────────────────────────────┘

と続く、javadocのドキュメントが表示されています。BankAccountがハイライトされているままEnter キーを押すと確定します。

まだまだ、すごいんです。それに引き続き(BankAccountのtのすぐ後で”(”をタイプして、また、Ctrl + スペースを押してください。そうすると、緑の小さなマークが4つ現れました、これが、BankAccountにマッチする候補です。そして、最初の二つには、
エクスクラメーションマークが付いています。これは、先ほどみた@deprecatedタグによるものでした。とりあえず、ここでは、最初から3番目の

BankAccount(String accountId, String password)を選んで、それぞれのアーギュメンとしてaccountId、passwordを設定します。そして、最後にCtrl + Sで保存します。

どうですか?すごいでしょ?この快感になれてしまうと、もう過去には戻れませんね。
この機能はすごいと同時に、いかに、javadoc作成時のドキュメントの大切さ、ネーミングコンベンション(インスタンス・メソッド等の名前の付け方の慣例)が大切かを実感していただけたかと思います。というのもドキュメントがなければ、このコンストラクタがどういう役割をするのか全くポップアップメニューからはわかりませんし、Javaのネーミングコンベンションに従わず、accountIdをaiとしたり、passwordをpwというようにしていれば、すぐにそのパラメータが何を意味するか、ポップアップメニューのクラスリストからは、推測しがたいですね。


■コードを一括コメント (Ctrl + /)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

さて、一つ目の、警告マークが消えたところで、修正したnew BankAccount(...
に続く2行分の

┌──────────────────────────────────┐
bankAccountObject.setAccountId(accountId);
bankAccountObject.setPassword(password);
└──────────────────────────────────┘

は、インスタンス生成時に設定しましたので、いりません。コメントしましょう。コメントするには、カーソールをbankAccountObjectのbにもってきて・・・、”//”をタイプして・・・、なんてことは、もうしませんよ。

その代わりに、

bankAccountObject.setAccountId(accountId);行のいずれかを一度クリックし、カーソールをその行の上に置きます。そして、

┌──────────────────────────────────┐
Ctrl + /
└──────────────────────────────────┘

で、その行がコメント行に変わります。コメントをとるときは、とりたい行で、バックスペース(日本語環境だと、¥マーク)を Ctrlを押しながらタイプします。これのすごいところは、複数行いっぺんにコメント、コメントアウトできる点です。


■タスク・ウィンドウとエラー・提案マーク
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

2つ目の問題点を修正する前に、もう一つ便利なものをご紹介しましょう。

『ウィンドウ』メニュー → 『ビューの表示』→『タスク』を選択します。すると、タスク欄の中に、

┌──────────────────────────────────┐
メソッド getPassword() は型 BankAccount で未定義です
└──────────────────────────────────┘

と表示されているとおもいます。これは、赤線が引かれているgetPassword()の右側のバツマーク(エラーマーク、重なっている電球マークは提案マーク)にマウスを当てたときのメッセージと同じです。ここには、パッケージ内のすべての問題の箇所が表示されますので、全体の問題点をチェックするには、利用価値があると思います。

ところで、今回一緒に表示されている電球マークは何を提案してくれているのでしょう?電球マークをクリックしてみてください。

┌──────────────────────────────────┐
メソッド’getPassword(..)’をBankAccountに作成
└──────────────────────────────────┘

という提案をしてくれました。しかも、サンプルコード付きで。このサンプルコードが役に立つかどうかはわかりませんが、問題点を考えるヒントになる場合があるでしょう。今回は、BankAccountにgetPasswordメソッドがないのにもかかわらず、getPasswordを使おうとした(使った)ために、このようなメッセージが表示されました。

ここの認証プロセスは、次号お話いたします(予定)ので、とりあえずここは、

┌──────────────────────────────────┐
userPassword.equals(bankAccountObject.getPassword())
└──────────────────────────────────┘

の部分を消去しまして、

┌──────────────────────────────────┐
bankAccountObject.equalsToPassword(userPassword)
└──────────────────────────────────┘

をタイプします。みなさんはもう、すべてタイプする必要はありませんね。

b a ぐらいをタイプして、Ctrl + スペースを押します。そうすると候補がでてきますので、一番上の、bankAccountObjectが選択されているのを確認し、Enterキーを押し、
"."(ドット)をタイプします。そうしますと、今度は自動的に候補が表示されます。Eclipseがドットの後は、クラスがきたり、メソッドがきたり、フィールドがきたりするだろうと認識して、自動的に候補を表示してくれます。その中から、

┌──────────────────────────────────┐
equalsToPassword
└──────────────────────────────────┘

を選びます。eをタイプすると候補一覧が絞られて選択しやすいと思います。
そして、Enterキーを押すと、カーソルが括弧の中におかれますので、そこで、
一行手前の、userPasswordをタイプします。もうなれましたね。これも "u", "s" とタイプし、Ctrl + スペースで候補が表示されます。最後に、Ctrl + Sで保存します。

すべての問題箇所を解決したところで、『実行』メニュー →『次を実行』→『Javaアプリケーション』を選びます。コンソールウィンドウが表示され、プログラムが実行されます。パスワードに、

┌──────────────────────────────────┐
mRha9
└──────────────────────────────────┘

を入力し、Enterキーを入力すると銀行取引のメインメニューが現れます。

なれてきましたら、Eclipseのメインメニュー群にある、人が走っているアイコン(ひだりから、6番目あたり)の右、下向き矢印アイコンをクリックし、その中から、
『次を実行』→『Javaアプリケーション』でも同じようにプログラムを実行できます。

最後に、ドキュメントを変更したので、BankUserInterface.javaのclassのドキュメントにあるversion情報も1.0624から、1.1215に変更しておきましょう。

┌──────────────────────────────────┐
* @version 1.1215
└──────────────────────────────────┘

少しずつEclipseになれてきましたね。次回は、実際にUserInterfaceクラスをみていきます。

それでは、また、お会いしましょう。

Mr.Hack


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆Javaで珈琲ブレイク◆
───────────────────────────────────
皆様からの激励・批判のメールをお待ちしております。
【発行者】 Mr.Hack - javacafebreak@hotmail.com
【掲示板】 https://javacafebreak.tripod.com/cafe_entrance.html
※質問は上記の掲示板からどうぞ。
【サイト】 http://javacafebreak.tripod.com
【発行数】 まぐまぐ[1179] Melma[202]
【解除】http://javacafebreak.tripod.com
※解除は上記のサイトからいつでもできます。
────────────────────────────────────
(c)2002 MR.HACK ALL RIGHTS RESERVED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

© 2002 MR.HACK ALL RIGHTS RESERVED