@Overrideアノテーション
ポリモルフィズムの節で、それぞれ子クラスのgetArea()メソッドに@Overrideアノテーションを付与しています。このアノテーションを付与することでオーバーライドしていることを確認できます。@Overrideを付与し、getarea()のようにメソッド名を間違えた場合(正しくはgetareaではなくgetArea)、コンパイルエラーとなるため、オーバーライドすることを確認する上で便利です。間違いをなくすためにも@Overrideアノテーションを付与することを強くお薦めします。
継承されるものとされないもの
継承と言うと簡単に思えますが、親クラスから継承されないものを正確に答えるのは難しいものです。『明解Java』が1番正確に記述されています。継承されるものはメンバだけであり、メンバとはフィールド・メソッド・クラス・インターフェースであるとの説明があります。ではメンバではないものはと聞かれても正確に答えることは入門者ではなくとも難しいと思います。メンバでないものにはインスタンス初期化子・静的初期化子・コンストラクタと説明してあります。コンストラクタが継承されていないことは多くの方は理解されていると思いますが、インスタンス初期化子と静的初期化子が継承されないことを理解されている方は少ないのではないでしょうか。筆者も恥ずかしながら『明解Java』を読むまでは知りませんでした。インスタンス初期化子、静的初期化子自体を知らない方は『明解Java』のp358とp354にあるので参照ください。
オーバーライド時のメソッドのアクセス制限
「オーバーライド」の節で『わかりやすいJava オブジェクト指向編』にオーバーライドの詳細な規則の説明があると記述しましたが、「アクセス修飾子はゆるいレベルにのみ変更できる」という説明でprivateからデフォルト、protected、publicに変更可能と受け取れる表現があります。しかし、この規則は次の規則「継承したメソッドだけをオーバーライドできる」という規則と矛盾します。private指定されたメソッドはオーバーライドできないことは「継承したメソッドだけをオーバーライドできる」の中で明記されています。4つの規則が挙げられており、3番目と4番目がMECE(mutually exclusive and collectively exhaustive)ではないため注意が必要です。『明解Java』p418「Table 12-3 オーバライドするメソッドに与えることのできるアクセス制限(修飾子)」の表が正確に表現されています。
例外の分類と階層~オーバーロード・オーバーライド時の例外
例外処理がオブジェクト指向プログラミングに特有な機能ではなく、オブジェクト指向プログラミング以前から存在していたことは『Bruce EckelのJavaプログラミングマスターコース―徹底探究!Javaのしくみとオブジェクト作法〈上〉 』のp22で説明されています。従って評価項目に例外関連の項目を入れてしまうと『明解Java』p505で例外は「他の書籍で取り上げる」と記述されているように、あえて取り上げていない本には不利な評価となってしまいます。とはいうものの、例外はぜひ入門編で取り上げなければならない項目です。筆者の経験から見て、例外処理の善し悪しがプログラムの品質の善し悪しを決める大きな要素の1つであると考えています。例外処理自体の全体的な思想はソフトウェアアーキテクトの仕事であるのかもしれませんが、例外処理を記述しないでコーディングすることはありえません。
筆者は火消し役としてあるプロジェクトに参画しました。プログラムはオフショア開発されており、日本側で作成した設計書には一切例外処理が記述されていませんでした。プログラムは設計書どおりに作成され、例外処理が一切記述されていなかったのです。日本であるなら誰かしら例外処理をどうするのか質問するのが当然のように思えますが、オフショア先の文化は違い、設計書に記述していないことは一切コーディングしないという主張でした。文化の違いの理解も浅く、契約にも盛り込んでいない以上、落ち度は日本側にあります。ソフトウェアアーキテクトという認識が当時あまりなかったこととは言え、例外処理についてプログラム設計書やソフトウェアアーキテクチャ設計書に記述がなかったのは例外処理がいかに大切であるかの認識が不足しているためであると考えています。今回はプログラミングの話をしていますが、いつか設計書を書く時には例外処理の記述を怠ると取り返しのつかないくらい甚大な損失を被ることを忘れないでください。入門レベルでしっかり押さえておきたい概念です。
入門者と言えどもデータベースを操作する必要に迫られることがあります。データベースのリソースオブジェクトをfinallyブロック内でcloseしnullを代入しないとメモリリークを発生します。リソースオブジェクトをfinallyブロックでcloseする習慣をつけましょう。finallyブロックはtry/catchの中にreturn文が記述されていても必ず実行されることを理解することが肝要です。
例外処理については『わかりやすいJava オブジェクト指向編』に入門者には十分な説明があるので、ここではあえて補足しません。本書を参照ください。
本の作りからの比較
表2は内容からではなく、本の構成を含めた作りについての比較を行い、読者にふさわしい本選びに役立ててもらえればと思います。
| 評価項目 | 明解Java | Java言語プログラミングレッスン | やさしいJava | わかりやすいJava |
| 言葉の定義の正確さ | ◎ | ○ | ○ | ○ |
| 説明のわかりやすさ | ○ | ○ | ◎ | ◎ |
| 説明の細かさ | ○ | ○ | ○ | ◎ |
| プログラムの多さ | ○ | ○ | ○ | ○ |
| 図表の量の豊富さ | ○ | ○ | ○ | ○ |
| 図表の分かりやすさ | ○ | ○ | ○ | ○ |
| 入門者が犯すエラーの説明の豊富さ | ○ | ◎ | ◎ | ○ |
| 索引の充実さ | ◎ | △ | ○ | △ |
連載の最後に
本連載の目的はシンプルで、読者の方にふさわしい本を見つけるための材料を提供することのみです。どの本を選ぶかは読者の方の判断となります。
筆者のお薦め(オブジェクト指向編)
「選択は読者の判断」とは書きましたが、それでは丸投げ状態になるため、筆者の独断の選択を紹介します。長年の経験上Javaを理解するにはオブジェクト指向プログラミングを理解できるかが大きな壁となります。その意味で『わかりやすいJava オブジェクト指向編』がもっともオブジェクト指向に関し充実しています。発行年月が2010年4月ということもあり、先行した本をよく研究されたのではないかと思います。この1冊は必須とし、後は自由に組み合わせるのが現時点でのいい選択であると考えています。『明解Java』も非常にいい本でありますが、説明の詳細さで筆者は『わかりやすいJava』を選んだほうがいいと判断しました。
筆者のお薦め(入門編)
入門編に関しては『明解Java』が言葉どおり1番「明解」に記述されています。入門編に関しては『明解Java』を必須とし、他の本と組み合わせる選択をお薦めします。ただし、2冊に分かれている『Javaプログラミングレッスン』と『わかりやすいJava』は2冊とも通して読んだ方が好ましいと考えます。
添付ファイル
表1はブラウザの制約上、前編(入門編)と後編(オブジェクト編)に分離し、それぞれの回で掲載しています。添付ファイルは前編、後編のすべての評価項目が分かるようExcelシートにまとめ、ページトップに添付ファイルとして置いています。ダウンロードしてご利用ください。
