Back To Main


┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃ ◆Javaで珈琲ブレイク vol.004◆
┃……………………………………………………………………………………………
┃ [不定期] まぐまぐ ID=0000088576 Melma! ID=m00061296
┃……………………………………………………………………………………………
┃ 今回からご覧になる方は、バックナンバーもご活用下さい
┃ http://www.melma.com/mag/96/m00061296/
┃ http://backno.mag2.com/reader/Back?id=0000088576
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

◆目次◆

■前回の解答
■Javaスタイルの大切さ
◆豆知識◆ Jarファイル
◆豆知識◆ API (エー・ピー・アイ、Application Programming Interface)
■InputStream、InputStreamReader、BufferedReaderクラス
■キャスト(型変換とほぼ同義)
■Question 4
■ちょっと珈琲ブレイク


皆さん、こんにちは。

Mr.Hackです。いかがお過ごしですか?少しずつ勉強も、仕事も、遊びも、Javaの勉強も調子に乗ってきましたか?まだまだ、5月病には早いですよ。がんばっていきましょうね。

皆さんががんばっているように、Mr.Hackもはれて、Computer Scienceのmaster's(修士課程)にacceptされました。Mr.Hackの学士が全くComputer Scienceと違っていたので、いきなりは入れてくれなかったのです。Undergraduateで修行してこい!ってことなのでしょうか。でもその甲斐あってか、GRE(日本での大学院版センター試験(共通一次?)みたいなもの)の点数が悪いにもかかわらずオッケーだったようです。アメリカでComputer Scienceを勉強してみたいと思っている人は、最初学部生として学び始めるのもいいとおもいますよ。授業内容は、結構高度ですから。


前回の宿題から入っていきましょう。


■前回の解答
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Question 2-1の答え

class HelloWorld {String getMessage() {return "ハローワールド";}

Question 2-2の答え


【ConvertToCelsius1.java】
━━━━━━━━━━━━ ここから ━━━━━━━━━━━━━━━━━━
import java.io.*;

/**
* 華氏・摂氏変換プログラム1
* ユーザーが入力した華氏を摂氏に変換する
*
* @author Mr.Hack
*/
public class ConvertToCelsius1 {

/**
* 華氏(Fahrenheit)から摂氏(Celsius)への変換
*
* @param fahrenheit 華氏
* @return Celsius 摂氏
*/
static double convertToCelsius(double fahrenheit) {
double Celsius = (fahrenheit - 32) * 5 / 9;
return Celsius;
}

/**
* メインメソッド
* ユーザーに入力を促し、華氏を入力後、摂氏を計算し画面に表示する
*
* @param args コマンドライン引数
* @exception IOException 入力値がdouble値ではない場合、例外発生
*/
public static void main(String[] args) throws IOException {

System.out.println("===============================================================");
System.out.println(" --- 華氏から摂氏への変換プログラム 1 --- ");
System.out.println("===============================================================");

System.out.print("華氏(Fahrenheit)を入力せよ : ");

InputStream myStream = System.in;
InputStreamReader myStreamReader = new InputStreamReader(myStream);
BufferedReader myBufferedReader = new BufferedReader(myStreamReader);
// readLine()メソッドで行単位ごとに読む
String fahrenheit = myBufferedReader.readLine();
//input streamを閉じる
myBufferedReader.close();
//String型fahrenheitをdouble型へ変換
double doubleFahrenheit = Double.parseDouble(fahrenheit);
// double型の華氏をconvertToCelsius()メソッドで摂氏に変換
double Celsius = convertToCelsius(doubleFahrenheit);
System.out.println("あなたが入力した" + fahrenheit + "Fは、摂氏で" + Celsius + "Cです");
}
}


━━━━━━━━━━━━ ここまで ━━━━━━━━━━━━━━━━━━


■Javaスタイルの大切さ
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

大事なところなのでもう一度確認しておきましょう。皆さんは、Question 2-1を発見できましたか?

え?コンパイルしようとしたときにエラーがでたから発見できた?

それでも、発見できたのですからすばらしい。でも、メルマガを見たときに発見できましたか。できなかった人は何故できなかったのでしょう?

それは、プログラミングのライティングスタイルに問題があるからです。

class HelloWorld {String getMessage() {return "ハローワールド";}

は、本来、

class HelloWorld {String getMessage() {return "ハローワールド";}}

とあるべきですね。最後にカーリーブレイス(curly brace)が二つ。視野を広げてみないと、二番目のスタートである{String...は目に入ってきませんね。だから、見落としてしまったのです。コンパイルをせずに発見できなかった方は、ある意味Javaスタイルの大切さを実感して頂けたと思います。

じゃーどうすればいいの?万国共通の決まり事ってあるの?

ありません。しかしながら、いいお手本はあります。"The element of Java style"に書いてある決まり事108条(vol.002、ちょっと珈琲ブレイク参照)です。この読者の皆さんが将来プログラムに携わる時にこの本を参考していくようになれば、それは慣習になります。決まり事になります。そして、他人のプログラムをみても素早く内容をとることができ、バグも発見しやすくなり、強いては、日本のプログラムディベロップメントに貢献するときがくるでしょう。

Question 2-2はどうでしたか?さて早速実行してみましょう。実行結果は、


===============================================================
--- 華氏から摂氏への変換プログラム 1 ---
===============================================================
華氏(Fahrenheit)を入力せよ : 72
あなたが入力した72Fは摂氏で22.22222222222222Cです

となります。

さて、InputStreamReaderクラスとBurreredReaderクラスが出てきました。これは、java.ioパッケージの中のクラスです。これはどうやってわかったのでしょう?一つは、HelloWorldDemo3.javaの一行目に

import java.io.*;

とパッケージをインポート(import)しています。これが手がかりです。java.ioというパッケージの中に、InputStreamReaderクラスとBufferedReaderクラスがあるので、java.ioパッケージをインポートしたのです。*(スター)はioパッケージにある全てのクラスを全てインポートするという意味です。javaとioの間にある"."(ドット)は階層を示します。つまり、java.io.*は、javaフォルダ(ディレクトリ)以下にあるioフォルダの、そのioフォルダ以下あるクラスを全てインポートするという意味です。

java.io.*って小文字ですけど、大文字でもいいんですか?

ここでは、ダメです。試しに大文字に変えて、コンパイルしてみてください。パッケージ java.IO は存在しません、とエラーメッセージがでます。でも、自分で作るときに、大文字でパッケージを作れば可能です。一般的には、packageは小文字にするのが慣習です。そのルールはどこからきたのでしょう?"The element of Java style"です。次号からいよいよスタートしますよ、『Javaスタイル職人への道』。

いまいち、このパッケージを理解できない方のために、実際にjava.ioパッケージを見てみましょう。Java SDK 1.3.1をインストールしたフォルダを開いてください。通常デフォルトでは、C:\jdk1.3.1_02になると思います。

C:\jdk1.3.1_02\jre\lib

までエクスプローラーでフォルダをクリック(ダブルクリック)してたどっていきます。すると、libフォルダにrt.jarファイルがありますね?そのファイルをZip解凍(Lhaz等)で開けるように、jar拡張子を関連づけます。rt.jarファイル上で右クリックして、open with(日本語だとアプリケーションから開く?:WindowsXP)のサブメニューに、choose program(プログラムを選択?:WindowsXP)で、お使いのZip解凍ソフトを選択します。Always use the selected program to open this kind of file(いつもこのプログラムで開く?)を選択してOKを押すと、jarファイルをZip解凍ファイルで解凍できるようになります。この仕方が??の方は、ファイルの拡張子をjarからzipに変えてみてください。そうすれば、Zip解凍ソフトで開けます。

さて、解凍する準備はととのいました。お好きなところに解凍して下さい。解凍すると、解凍には結構時間がかかるので、息抜きに珈琲でもどうぞ。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆豆知識◆ Jarファイル
────────────────────────────────────

Jarはジャーと読みます。正式名称はJava ARchive Fileです。これって何なんでしょう?実は、Zipファイル(圧縮フォーマットの一つ)の兄弟なんです。つまり、圧縮フォーマットなんですね。実体はZipファイルなので、拡張子をjarからzipに変えてあげるか、jarファイルにZip解凍ソフトを関連づけしてあげることによって、解凍できます。Zipファイルと違うところは、META-INFフォルダ以下にmanifest.mfファイルがある点です。このファイルには、ベンダーインフォメーションを記述したり、パッケージのメインクラスを指定して、release versionがわかるようにしたりします。例えば、manifest.mfファイルの中に、

Main-Class:com.mycompany.MyClass

と指定し、MyClass.javaで

package com.mycompany;

public class MyClass {
public static void main() {
String version = "current version: 1.01";
System.out.println(version):
}
}

のように、main()メソッドでversion情報をプリントアウトするようにしておくと、MyClassを含めたmyjar.jarファイルと作ったときに、コマンド上で、

java -jar myjar.jar

とタイプすることによって、このmyjar.jarのバージョン情報をプリントアウトすることができます。

jarファイルはまた、パッケージを提供したり、自分のapplicationに組み込んだりしたいときにそのjarファイルを自分のパッケージに入れることによってjarファイルのクラスを使うことができます。たとえば、jarファイル先をJBuilder等で指定して、

MyProject.javaクラスで、

import com.mycomany.MyClass;

とインポート指定することによって、MyClassのメソッド等が使用できます。

これらは、後ほどJBuilderを使い慣れたときにまたふれていこうと思います。
────────────────────────────────────
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


解凍は終わりましたか?解凍すると、rtフォルダが出現します。そのrtフォルダ以下には、

com
java
javax
META_INF
org
sun
sunw

とあり、META_INF以外は全てパッケージです。javaフォルダをクリックしてください。javaフォルダ以下には、

applet
awt
beans
io
lang
math
net
rmi
security
sql
text
util

がありますね。お!それです。ioとありますね。そのioフォルダをクリックしてください。その中に、ずらーーと93個ものクラスファイルがあります。これは、皆さんが最初Helloworld.javaをコンパイルしてクラスファイルを作ったのと同じbyte code形式のファイルです。その中から、InputStreamReader.classとBufferedReader.classを見つけられましたか?先ほどの

import java.io.*によって、ioフォルダ以下にある93個のclassファイルをインポートしたわけです。解凍したフォルダ構造からわかるように、Java 2 Platform, Standard Edition のAPIの実体は、パッケージの集まりで、パッケージとは機能が似たもの同士でまとめたクラスということになります。

ところで、InputStreamReader.classとBufferedReader.classがio以下にあるってどうしてわかったでしょう?中級者の皆さんは、初心者の方からのこの問いにどうやって答えますか?んーーそれはね、長い経験と勘により・・・と答えますか?もし、

import java.io.*;

import java.io.InputStreamReader;
import java.io.BufferedReader;

としていたらどうですか?InputStreamReader.classとBufferedReader.classはio以下にあるclassだと一発でわかりますね。こう記述するのは、初心者の方のためだけに限りません。これは、大規模な開発になっていけば行くほど重要になってきます。一つのクラスに、標準のjava APIやサードパーティーが提供するAPIを使うケースがたくさん出てきます。そのときに、

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

とすると、どこのクラスを使っているのかさっぱりわかりません。そのため、そのクラスの仕様を確認しようとするとき、よけいな時間と労力を費やすことになります。自分が書いたプログラムは自分だけが見るとは、限らないのです。上記より、

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

と記述することによって、どのクラスを使用したか一目で確認できます。いままで悪い例として、

import java.io.*;

と使っていましたが、以後は、使用するクラス名まで、記述してくださいね。

これからは、*(スター)は、いかなる時も禁止ですよ。

えークラスを探すのが面倒くさい?時間がかかる?

一時の手間が、あとで、多大の時間を節約してくれます。是非実行して下さいね。

いままでは、jarファイルを解凍して、その中のフォルダをたどって、InputStreamReader.classとBufferedReader.classを見つけました。しかし、これは、けっこう大変な作業の割に、そのクラスを見つけたとしても、何もいいことはありませんでしたね。classがどんな仕様になっているのか、メソッドがどんなものがあるのかもわかりませんでした。仕様を確認するには?

そうです。GO TO APIでしたね。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆豆知識◆ API (エー・ピー・アイ、Application Programming Interface)
────────────────────────────────────

APIとはApplication Programming Interfaceの略で、Javaクラスのセット(パッケージ(package)、C、C++的に言えばライブラリー(library))のことを言います。字面からいえば、ApplicationをProgramするのに必要なInterfaceを提供するもの、ということです。なんで、interfaceなんて言うんでしょう?Interfaceとはあるシステムの境界面をいいます。User Interfaceといえば、システム(Application)を使う側のUserが、あるシステムの境界面(Interface、ウィンドウ形式であったり、コマンド形式であったりする)を通してシステム内部のプログラムとやりとり(住所録でいえば、新しく住所を入れたり、修正したり削除したりする)をすることをいいます。GUI(Graphical User Interface)は、グラフィカルなウィンドウでマウスを使って、やりとりをすることをいいます。同じように、APIは、packageのJavaクラスとやりとりする境界面を提供するものなのです。APIでいうInterface(境界面)とは、クラス(Class)、インターフェイス(interface)、コンストラクター(constructor)です。それらを通して、その中身(たとえば、クラスのメソッド(method))を使用するのです。
────────────────────────────────────
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


ブラウザを開いてお気に入りに登録してあるAPIを開いてください。いつものように、左下のウインドウでInputStreamReaderを検索して見つけてください。見つけてクリックすると、クラス InputStreamReaderの一番上のところに、


java.lang.Object
|
+--java.io.Reader
|
+--java.io.InputStreamReader

とあります。ほら、ありましたね。java.ioというパッケージ名が。これで、どのパッケージかがわかりました。ちなみに、上記の階段のような表記は、ObjectクラスとReaderクラスを継承(Inheritance)しているということを意味します。Objectクラスは全てのクラスのスーパークラスなので、逆に言うと、他のクラスはすべて、Objectクラスを継承してます。継承のお話は、改めて後ほどメインプロジェクトである住所録がスタートしたら、折を見てお話していきたいと思いますが、簡単に言いますと、先祖の性質・性格と引き継いでいるということです。例えば、Object クラスをAPIで見てください。メソッドにequals()やtoString()というよく使われるメソッドがありますが、toString()はたとえば、Mr.Hackが作ったHelloWorldクラス(toString()は定義していない)でも使うことができます(toString()の実装は次号参照)。

ところで、BufferedReaderクラスとInputStreamReaderクラスは何をするクラスなのでしょう?


■InputStream、InputStreamReader、BufferedReaderクラス
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

APIでSystemクラスに行ってください。Systemクラスのフィールドの概要を見るとSystem.inとあります。その左側には、戻り値がInputStreamだとなっています。クラスのオブジェクトの時は、戻り値という表現よりも、参照(refer)していると考えた方がわかりやすいと思います。。例えば、

InputStream myStream = System.in;

というのは、System.inが何か値を戻す(返す)と考えるのではなくて、myStreamという参照変数がInputStreamのオブジェクトを参照していると考えるのです。前回、newはメモリーを確保すると言いました。今回はnewは使いませんが、すでに、Systemクラスの中ですでに、InputStream in = new InputStream()というメモリー確保(オブジェクト生成)がすでにあって、

InputStream myStream = in;

のように、in参照変数が指しているオブジェクト(メモリースペース)をmyStream参照変数が参照すると考えるのです。

InputStreamクラスのオブジェクトはどういう役割をしているのでしょうか?

キーボード ---------→ コンピューター

InputStreamオブジェクトはキーボードからコンピューターに向かっている川(線)の流れだと思ってください。その川の上をユーザーによってキーボード上から入力された文字が次々の流れて行きます。それを、InputStreamクラスのread()メソッドによって、一文字づつ(byte)順番にすくい上げます。

System.in.read();

でバイト単位(byte)の文字を得ることができます。しかしながら、1byte(=8bits)は半角一文字(たとえば、A)なのでUnicodeである日本語の全角(16bits)は読めません。それを、Unicodeが読めるようにキャラクタ単位(char)ごとに川からすくえるようにしたのが、InputStreamReaderクラスです。このクラスはバイトストリーム(byte stream)からキャラクタストリーム(char stream)に変換してくれます。川の例で言えば、半角文字を二つ分すくえるようになったのです。InputStreamオブジェクトが片手で半角一文字づつすくい上げるとすると、InputStreamReaderオブジェクトは、両手で2倍分の文字をすくい上げることができます。InputStreamReaderクラスもread()メソッドがあるので、

InputStreamReader myStreamReader = new InputStreamReader(System.in);
myStreamReader.read();

でキャラクタを一文字づつ得ることができます。

しかしながら、これでは、長い文字列を読むとき毎回毎回、read()メソッドを適用してキャラクタを一文字一文字読み込んで行かないといけませんね。そこで登場するのがBufferedReaderクラスです。これは、一文字一文字をバッファー(buffer)に蓄えて一度に大量に読み込んで行くことができます。川の例でたとえれば、片手でもなく、両手でもなく、川の流れから、網でドバッとすくい上げる感じです。その網でドバッとすくい上げた中から、readLine()をつかって一行分読み込みます。
一行とは、文字列の終わりにつく'\n'(new line)までです。Enterキーを押すことによって'\n'が入力されます。

BufferedReader myBufferedReader = new BufferedReader(myStreamReader);
String fahrenheit = myBuffereReader.readLine();

そして、最後に川の流れを止めてあげないと水が流れっぱなしになってしまいますね。close()メソッドを使って川の流れを止めて(閉じて)あげます。

myBufferedReader.close();


ちなみに、今までのBufferedReaderオブジェクト取得までの一連の作業を、

BufferedReader myBufferedReader = new BufferedReader(
new InputStreamReader(System.in));

と書くこともできます。まったく同じ意味です。


■キャスト(型変換とほぼ同義)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

最後に、String型から、double型への変換(キャスト)を見てみましょう。今までの課程でキーボードから打った文字列はString 型になりました。しかし四則演算するには、String型ではできません。String型の"72.0"とdobule型の72.0は違うのです。キャストには、DoubleクラスのparseDouble()メソッドを使います。APIのDoubleクラスのparseDouble()メソッドを見てください。パラメータとしてString型、戻り値としてdouble型を返却します。つまり、String型からdouble型へキャストできるのです。これで、やっと、四則演算できます。その値を
convertToCelsius()メソッドへ渡し計算結果を戻り値として返してくれます。
それを、System.out.println()でスクリーンに表示します。

ところで、宿題に取り組まれた方の中には、parseDouble()メソッドとvalueOf()メソッドはどう違うんだろうと思われた方がいるかもしれません。でも、よく見てください。valueOf()メソッドは戻り値はDouble型です。大文字で始まる表記はクラスでしたね。そう、Doubleというクラスなのです。そのため、Double型なのです。

それじゃー、double型は?

double型はプリミティブ型といってクラスではありません。ある意味オブジェクト指向言語には似つかわしくないプリミティブ型です。なんでこんなプリミティブ型があるのでしょう。それは、やはり、四則演算・文字の取り扱い・Expressionという頻繁に扱うものは、クラスで武装するよりも手間暇かからず都合がいいからだと思います。

プリミティブ型である、byte、short、int、long、float、double、char、booleanにはすべて、クラスがあります。しかしながら、intとcharだけは、ただ始まりを大文字にするだけではなく、Integer、Characterとします。なぜでしょう?クラス名は省略しないようにするのがjavaの慣習だからです。int、charはC,C++等でも同じ表記ですので、他の言語も意識した互換性だと思います。

byte - Byte
short - Short
int - Integer
long - Long
float - Float
double - Double
char - Character
boolean - Boolean

ところで、Doubleとクラスでdouble型をラップする(wrap、包み込む)によって、何がいいのでしょう?一つの理由として、クラス武装することによって、他のクラスで使えるようになります。doubleという裸では相手にしてくれないのです。
例えば、Stackクラスを利用しようとします。stack(スタック)とは最初に保持した値は一番最後に取り出されるというLast-In-First-Outのデータ構造です。例を挙げると、食器を積み重ねた状態を想像するとわかりやすいでしょう。食器を食器棚に重ねていきます。最初においた食器を取り出そうとしても上に重ねた食器を取り出さないと取り出せません。逆に一番上に置いた食器は一番最初に取り出すことができます。このデータ構造にdouble型を直接入れる(stackではプッシュ(push)という用語を使う。取り出しは、ポップ(pop))ことができません。

Stack stack = new Stack()

stack.push(new Double(2.0));
stack.push(new Double(3.0));
stack.push(new Double(4.0));

というように、プリミティブ型の2.0、3.0、4.0をDoubleクラスでラップして(包み込んで)あげてから、stackにプッシュして(いれて)あげます。

さて、一通り、説明しましたが、質問等があれば、掲示板の方に投稿してください。皆さんからのフィードバックがこのメルマガをよりよいものにしていけると思います。難しい、簡単何でも結構です。

さて、今週の宿題です。


■Question 4
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

上記のConvertToCelsius1.javaをコンパイルし実行した後、何も入力せずにEnterキーを押しなさい。

Exception in thread "main" java.lang.NumberFormatException: empty String
at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:9
89)
at java.lang.Double.parseDouble(Double.java:184)
at ConvertToCelsius1.main(ConvertToCelsius1.java:29)

という例外が発生するが、例外が発生しないように、それを修復しなさい。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ヒント

ConvertToCelsius1.javaプログラムは、アメリカに行ったあなたが、友達のために作ったプログラムでしたね。72といれれば、うまく、22.222...Fと計算してくれました。友達もこれで天気予報がわかると大喜びです。しかし、たまたま、何も入力せずにEnterキーを押したら、上記の例外が発生してびっくりです。あなたも、思っていなかった自体にびっくりです。そこで、すぐに修正すると友達に約束し、プログラミングを始めます・・・。

APIのDoubleクラスのparseDouble()メソッドをクリックすると、

例外:
NumberFormatException - 文字列が解析可能な double 値を含まない場合

という記述があります。空文字を入力した時に発生する例外をキャッチしてあげれば良さそうです。

例外をキャッチするには、try & catch構文を用いて

try {
例外を発生させる文
}
catch (Exception e) {
System.out.println("例外が発生しました");
}

でできます。上記で"例外を発生させる文"が例外を発生させた時だけ、catch構文は実行されます。つまり、例外が発生しなかった場合は、

System.out.println("例外が発生しました");

は実行されません。これをつかって、上記の訳のわからない例外メッセージを防いでみてください。


来週は、例外処理について勉強していきます。それでは、またあいましょう。hava a nice day.

Mr.Hack

■ちょっと珈琲ブレイク
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
コンピューターサイエンスの科目の一つにSoftware Engineering(ソフトウェア工学)という科目があります。その授業の中で、XP(Extreme Programming)の一環として、二人組のグループを作り、2週間という期間でFirst Releaseまできるようプログラムをし、2週間ごとにプロジェクトを変えていきます。内容は、JSP、Servletをつかい、カリキュラムプランナーやFAQ、学生の登録許可、授業評価フォーム等の単純なweb applicationシステムです。それをFirst Releaseした後、今度はグループメンバーは今まで一緒に作業しなかった人とペアを組み、今まで携わっていないプロジェクトを引き受けます。つまり、全く他人が書いたプログラムを一から理解しディベロップメント(発展)させなければなりません。このときに非常に役に立つのが、Javaスタイル&Java documentationです。Javaスタイルによって統一化されたスタイルとJava ドキュメントによる詳細な説明が今まで全く前提知識のない後任者の役に立つのです。このクラスは何が目的なのか?このメソッドは何をするのか?もし、これがC言語のようなスタイルを使い、Javaドキュメントがなければ・・・、と考えるとぞっとします。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


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

© 2002 MR.HACK ALL RIGHTS RESERVED