タイトル
Java Puzzlers 罠、落とし穴、コーナーケース
著者
ジョシュア・ブロック (著), ニール・ガフター (著), 柴田 芳樹 (翻訳)
出版社
ピアソン・エデュケーション
Amazonで購入する

パズラー(Puzzler) とタイトルがつけられていますが、この本は単なる遊びの本ではありません。見つかりにくいバグの原因になる問題ばかり載っています。なんとなくでコーディングしているとはまってしまうバグばかりが集められていて、「どうしてこんな動きをするの?」 と目を疑う問題も多くあります。

本書に載っている問題はそのほとんどが、Java の言語仕様を理解しているか?、JavaAPI をちゃんと理解しているか? という問いかけのようなものです。バグを出さないようにするには何に気をつけたらよいのか、を考えるきっかけになる本です。

本書は、Java プログラミングの経験がそれなりにある人が対象読者です。結構歯ごたえのある問題が多いので期待して読んでみてください。

特徴

「まさかこんな動きするわけないよ」 と思うような問題も、実際に動作させて見るとほんとにそんな動きをする、そんな問題ばかりが 95 問も集められています。

また、ちょっと隙を見せるとあっという間にバグに包まれてしまう、そんな問題も多くあります。例えば、次の問題なんか、わかっているのに引っかかってしまうような問題ではないでしょうか?

Me.class.getName() は、クラス Me の完全修飾名、すなわち "com.javapuzzlers.Me" を返します。このプログラムは何を表示しますか?

package com.javapuzzlers; 

public class Me {
public static void main(String[] args) {
System.out.println(Me.class.getName().replaceAll(".", "/") + ".class");
}
}
『JAVA PUZZLERS』 P.43 パズル21

どうでしょう?こういうプログラムは、例えばクラスのファイル名に対応するフォルダを検索したりするときに書いたりします。このプログラムの出力結果は、次のようなものです。

///////////////////.class

String#replaceAll メソッドは、第一引数には正規表現をとります。正規表現で "." は任意の一文字にマッチする文字のため、クラスの完全修飾子すべての文字にマッチして全部が "/" になってしまったのです。

期待通りに処理するようにするには度売れ場よいかは、本書を読んでもらうとして (えっ?ずるい?)、『JAVA PUZZLERS』には、こんな問題がたくさん載っているのです。

本書を Java の勉強用に使うのなら、JavaAPI の JavaDoc を読みながら手を動かすことをお勧めします。本書を読み終わったときには、Java についてかなりの知識がついているでしょう。

参考

  • 良い Java のコーディングを身に着けるなら、これしかない!
  • Java の格言。深いです。
  • Java の鉄則