Mr.Hack | ||
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 皆様、ご無沙汰しております。 9月以降、秋学期が始まり、とても忙しい日々を送ってきました。今学期は、先学期以上に実りの学期になりそうです。Javaに関していえば、strutsフレームワークによる、Web Applicationの開発、Eclipse IDEとの出会い、C#によるWeb Applicationの開発、そして、暗号・電子署名の知識等、とても楽しく、あっという間に11月ももう終わりです。また、Java言語についても少しずつ、新しいトピックを吸収しております。 この吸収した知識を生かすべく、12月中旬には、Javaで珈琲ブレイクを再開したいと思っております。今までのメルマガのスタイルで行こうとは思っていますが、こんなトピックを扱ってほしい等ありましたら、メール頂けると幸いです。皆様のご要望にできるだけ添いつつ、新しい知識を紹介していきたいと思っております。 それでは、何を使うの? という方には、『Eclipse』です。http://eclipse.orgからどんなものかアクセスできます。スクリーンショットをご覧になりたい方は、こちらからご覧ください。http://www2.hawaii.edu/~takuyay/eclipse/welcome.html これは、すごいですよ。なんていいましても、オープンソース。IBMが$40million(50億円近く?)に値する技術提供をしたというだけのことはある製品です。ソフトウェアエンジニアリングで、ある意味デファクトスタンダードとなっている、JUnit、Ant、CVS、Refactoring、Javadoc作成等標準でサポートしています。しかもフリー。 もし、あなたが、日曜プログラマで、ノートパットで、コマンドプロンプトから、実行して、それで十分満足ハッピー、世界の動向なんてどうだっていいのよん。という方は、気にしないでください。今までのお話をお忘れください。 いずれ、日本でも、もっと、ソフトウェアエンジニアリングが脚光を浴びれば、Eclipseのハウツー本なる本も出てくるのではないかなと思います。4ヶ月ほどで新しい製品がでるJBuilder Enterpriseに36万円も投資できる個人の方がいらっしゃいますか?値段云々は抜きにしても、オープンソースなJUnitやAntをEnterprise Versionじゃないと(JBuilderと)使えない、というのも、どうかと思う限りです。 そんなこんなを、この9月からの約3ヶ月の間考え、Eclipseでいけると思うようになりましたので、12月からは、ちょくちょく、Eclipseでプログラミングをしていこうと思います。日本でも、草の根といったらへんですが、企業単位ではなく、学術レベルや、個人レベルでも、高度なソフトウェアエンジニアリングの知識を吸収して行かなくてはならない時期にきていると思います。お金を持っている企業しか・・・というレベルでは、いつまでたっても、日本はソフトウェア立国には慣れない気がしてなりません。 というわけで、来月から、また、Javaで珈琲ブレイクを再開したいと思っております。どうぞよろしくお願いします。 以下は、先日、熱心な読者の方からいただいた、メールに対する回答です。興味のある方は、ご覧ください。 > 掲示板初投稿です。「Javaで珈琲ブレイク」大変お世話になっております。今 コンストラクタは、クラス名と同じ名前で、戻り値がない、特別なメソッドと、覚えておくといいかもしれません。例えば、クラス名がFooとすると、コンストラクタは、Foo()となります。 class Foo { コンストラクタは、必ずクラスに一つ存在します。しかしながら、省略することも可能です。省略した時は、Foo() { super();}が呼ばれていることを意味します。例えば、 class Foo { は、 class Foo { と同じ意味になります。 では、コンストラクタは、省略もできるし、いったい役割は何なの?とお思いでしょう。 コンストラクタの主な役割は、新しいインスタンス生成時に、必要な初期化を一緒にすること、です。言い換えれば、インスタンス生成時に、初期化忘れを防ぐこと、です。簡単な例を挙げますと、 class BankAccount { これは、文法的に正しいです。インスタンスフィールドがprivateですから、このクラスのクライアント(例えば、BankUserInterfaceクラス)は、アクセスできませんので、settter、getterメソッドが必要になりますね。 クライアントであるBankUserInterfaceクラスは、例えば、以下のように使うでしょう。 BankAccount account = new BankAccount(); しかしながら、もし、"Mr.Hack"の文字列をsetterメソッドを使ってセットせずに、getterメソッドで文字列を得ようとしたらどうなるでしょう。 BankAccount account = new BankAccount(); この場合は、BankAccountクラス内のthis.accountHolderNameの参照変数がnullを指したままなので(Stringのような参照型は、デフォルトで、nullで初期化される)、もし、名前を比較するために、.equals()メソッドをmyNameに適用しようとすると、 myName.equals("Mr.Hack"); // NullPointerException 予期しないNullPointerExceptionが起こります。というのも、myName参照変数は、nullを指していて、nullにequalsメソッドを適用できないからです(equalsはStringクラスのメソッドですから)。 なぜ、予期しなかったのでしょうか?たぶん、BankAccountのインスタンス生成時にholder nameも一緒に初期化して、あるいは、初期化した後に、すぐにaccountHolderNameに値をセットしたと想定したからでしょう。もちろん、equals()メソッドをmyNameに適用する前に、nullをチェックしたり、try/catch構文を用いることもできます。 if (myName != null) { try { しかしながら、参照型(Stringなどのクラス)のメソッドを使う前に、その参照変数全てに、nullをチェックしていたら、とても大変な労力になってしまいます。それより、インスタンスを生成時に、nullは許さない、という約束事をしておけば、わざわざ、BankAccountクラスのインスタンスを利用する時、nullをチェックしなくてよいですね。 class BankAccount { この場合は、BankAccountインスタンスを生成する時は、必ず、accountHolderNameとbalanceをセット(初期化)しなければなりません。 BankAccount account = new BankAccount("Mr.Hack", 1000.0); そのため、new で生成されたBankAccountインスタンスが存在する = accountHolderNameとbalanceには、何かしらの値がセットされている、ということがいえるわけです。なぜなら、2つのパラメータなしには、BankAccountインスタンスを生成できないからです。そのため、BankAccountインスタンスを使うクライアント側では、安心して、StringであるmyNameにStringメソッド(equals, indexOf等)を適用できるようになります。 実は、大規模なプログラムを組んでいくと、コンストラクタを使わない場合、(デフォルトのコンストラクタは使うことになりますが)、初期化忘れが、多々起こり得るのです。 というわけで、要約しますと、コンストラクタは、必要な値を、初期化するために存在するということができます。
いい質問だと思います。こうすれば、わかりやすいと思います。 コンストラクタに3つのパラメータがある時は、accountIdとpasswordが適切かどうかチェックしていますね。 public BankAccount(String accountId, String password,
double amount) { それでは、パラメータが二つの時、つまり、パラメータがaccountIdとpasswordだけの時、 public BankAccount(String accountId, String password)
{ とすれば、accountId、passwordをそれぞれsetterメソッドでチェックしていますね。この場合は、balanceはどんな状況でも、0.0をデフォルトとしてセットしています。しかしながら、上の2つのコンストラクタは、パラメータの数と、setBalanceのパラメータ以外は全く同じことをしています。これをもっと、効率よくできないでしょうか?それが、thisキーワードです。ここで、thisは、すでに存在するコンストラクタを指しますので、thisを使えば、上の最初のコンストラクタを呼び出すことができます。 public BankAccount(String accountId, String password)
{ これは、最初の3つのパラメータのコンストラクタを呼んでいて、その3つのパラメータのコンストラクタのなかで、accountIdとpasswordをチェックしてるので、事実上、thisを使っても、accountIdとpasswordをチェックしていることになります。 このthisを使う方法は、パラメータの数が違うコンストラクタを何個か作らなければならないが、コンストラクタの役割がほとんど同じ場合には、有効です。 ただ、thisというキーワードはコンストラクタとしての役割もありますが、むしろ、インスタンスとして使われる場合の方が多いので、インスタンスとしてのthisも一緒に覚えておくことをおすすめします。 例: public void setAccountHolderName(String accountHolderName)
{ それでは、皆さん、12月中旬にまたお会いしましょう。 Mr.Hack ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
© 2002 MR.HACK ALL RIGHTS RESERVED |