「Java本格入門」を読んだ
せろさん に献本して貰いました。 ありがとうございます!
この本はJavaの入門書ではありますが「本格」と付いているだけあって、
- コレクションの実装に踏み込んでどの場面でどの実装を使うべきか
- Map#computeIfAbsent の現場あるあるな使い方
- 正規表現関連のオブジェクト( Pattern 、 Matcher )と String のメソッドの使い分け
など、実践的な内容が含まれています。
また、Java 8を前提として書かれてはいますが、 ファイル操作に関してはJava 6までのやり方( java.io )とJava 7以降のやり方( java.nio.file )が、 日時操作に関してはJava 7までのやり方( java.util.Date 、 java.util.Calendar )とJava 8以降のやり方( java.time )が両方書かれています。 趣味プログラミングならいつでも最新のバージョンを使っていれば良いですが、仕事では案件によっては保守だけに徹しており古いやり方でコードを読み書きする必要がある場合もあるでしょう。 この本ならレガシーと最新のどちらのやり方も学ぶ事ができます。
他にも、文法的に許可されてはいるが実践的な観点から書かない方が良いコードを教えてくれたり、 インターフェースと抽象クラスの良い使い分け方を示してくれたり、 執筆陣の知識・経験を元に書かれていることが単なる初心者向けの入門書とは異なるところだと感じました。
私の感覚でいうと、まったくの新人ではなく現場に出て2年目あるいは3年目ぐらいがこの本を読むのに適したレベルかな、と思います。
間違いと思われる記述
いくつか間違いがあったので挙げておこうと思います。
35ページ、 >> 演算子の説明
正負の符号を表すビットは保持し、それ以外の空いたビットは0埋めする。
右方向の算術シフトは空いたビットを0埋めするのではなく、符号と同じビットで埋めます。
82ページ、インターフェースの説明
インターフェースは必ずpublicになるため、インターフェース名の前に書くpublicは省略することができます。
インターフェース名の前の public を省略するとパッケージプライベートになります。
また、ネストしたインターフェースは private にすることもできます。
156ページ、メソッド参照の文法
これは間違いというより、表の内容が足りていないのです。
staticメソッドを参照する記法として次のものを挙げています。
{クラス名}::{メソッド名}
でもこれ、場合によってはインスタンスのメソッドを参照する記法としても使えます。
例えば、次のようなコードです。
//{クラス名}::{メソッド名}の記法でインスタンスのメソッドを参照している
ToIntFunction<String> f = String::length;
int i = f.applyAsInt("foobar");
197ページ、ラムダ式内での例外について
ラムダの中に記述した処理で例外が発生する可能性があります。 それが検査例外だった場合は、捕捉しないと、コンパイルエラーが発生します。
Stream APIで使われるラムダ式、つまり Function や Predicate であればそうですが、 例えば Callable のラムダ式であれば call メソッドは throws Exception と宣言されているので Exception を catch する必要はありません。
その他の軽い間違い
108ページ、フィボナッチ数を求めるコードが書かれていますが、定義を見ると F0 = 0 F1 = 1 Fn = ... となっていますが、 昔ながらの for ループを使ったコードは i <= 1 のときに 1 を代入しているので、 定義とコードが合ってないですね。
それと134ページ、「Mapインターフェースでの要素の取得、変換」に値の集合を取得するメソッドとして valueSet が挙げられていますが values の間違いだと思います。 なお、 values の戻り値は集合( Set )ではなくコレクション( Collection )です。
あと、めっちゃ細かいところで言うと、183ページにAutoClosable、Closableという記述がありますが、 正しくはAutoCloseable、Closeableです。 (めっちゃ分かりづらいですが……)
まとめ
このようにいくつか間違いと思われる記述もありましたが、 これらは前半の章(文法の解説などのまさに入門的な章)に集中していました。
読み進めるにつれてより実践的な内容が増えており、 現場で使える知識を付けることができるのではないでしょうか。