スッキリわかる Java入門 実践編 第2版 (スッキリシリーズ)を読みました。
図や表が多く、会話形式で話が進むので、わかりやすくすらすらと読み進められました。
内容紹介によると、本書の対象読者は以下のとおり。
正規表現やコレクション、データベース連携、開発ツール、リファクタリング、並列処理など、現場で必須の知識を広く取り上げていますので、基本文法やオブジェクト指向の概念はわかった、さらにステップアップするための知識を習得したい、という方
Javaを用いた開発の実務経験がある僕も本書で勉強になったポイントがいくつもありました(単に僕のスキルが低すぎるだけ!?)。ということで、本書は以下の人におすすめです。
- Javaの基礎は学習したけど、現場で使う知識も習得したい
- 久々にJavaを触るので改めてJavaを勉強したい(僕です)
今回は本書を読んで勉強になったポイントをまとめてみます。
文字列の連結
文字列を連結する方法はいくつかあるようです。
- +演算子で連結するたびに、Stringインスタンスがnewされるため処理が遅い
- StringBuilderは処理が速い。ただし、スレッドセーフではないため、マルチスレッド環境には適していない
- StringBufferは処理が速い。マルチスレッド環境にも適している。ただし、StringBuilderよりは遅い
日付と時間の取り扱い
Java8から、日時APIが追加されたようです。従来のDateクラスやCalendarクラスと違い、以下の特徴があります。
- スレッドセーフである
- 曖昧な日時を表現できる
- 「ナノ秒」単位で時間を扱える
新しく追加された日時APIの詳細については、以下記事をご覧ください。
Java8で追加された日時APIの特徴と使い方 - Reasonable Code
Objectの3大基本操作
すべてのクラスの継承元をたどっていくと、java.lang.Objectクラスに行き着きます。つまり、Objectクラスはクラスの祖先のようなものですね。
すべてのクラスがObjectクラスを継承しているということは、すべてのクラスでObjectクラスのメソッドが使える(オーバーライドもできる)ということです。Objectクラスの中で特に重要なメソッドは以下の3つ。
- toString():文字列表現を得る
- equals():等価判定を行う
- hashCode():ハッシュ値を得る
新しいクラスを作成した際、これら3つのメソッドをオーバーライドしないと意図しない結果になるという話です。
これは、3つのメソッドはObjectクラス用のメソッドであって、作成したクラス用のメソッドでないからです。作成したクラスに対して、どのような文字列表現を返せばいいか、何をもって等価と判定するのか、どのようなハッシュ値を返せばいいかは開発者にしかわからないんですね。
そこで、それぞれのメソッドをオーバーライドして、そのクラスにあった動作に上書きしてやらないといけないんですね。
わかりやすいように、toString()を例にあげてみます。
上記コードはtoString()をオーバーライドしなかった場合です。Hero型のインスタンスに対してtoString()してもよくわからない結果になっています。これは、Objectクラス用のtoString()を実行しているからです。
今度はtoString()をオーバーライドして、開発者が意図した文字列を表現するようにします。
それっぽい文字列表現になりましたね。
ということで、新しいクラスを作成した際、Objectクラスのメソッドを使用する場合はオーバーライドするようにしましょう。
列挙型
列挙(enum)型とは、指定した種類の値だけを入れられる型のことです。列挙型を利用することで、型安全を実現できます。ちなみに、列挙型はJava5以降で使えます。
型というのは、変数に予期しない種類の情報が入らないようにするための安全装置のようなものです。そして、型によって担保される安全性のことを型安全といいます。
百聞は一見にしかずということで、型安全についてコードで説明してみます。
上記コードは型安全でない例です。
Jankenクラスのコンストラクタを呼び出す際、あらかじめ用意しておいた定数を用いるのが正しい使い方ですが、int型であればどんなものでも引数として受け入れられます。例えば、コンストラクタの引数に4を入れてもコンパイルエラーとならず受け入れられるのです。
型安全にするためには、グー、チョキ、パーのみを許容する型が必要です。そこで登場するのが列挙型。以下コードをご覧ください。
列挙型を使うことで、グー、チョキ、パーのみを許容できます。もしコンストラクタに誤った引数を入れた場合でも、コンパイルエラーが発生するので安全ですね。
型安全を実現するために列挙型を積極的に使いましょう。
環境依存を排除する
Javaは「Write once, run anywhere(一度書けば、どこでも実行できる)」と言われているので、環境依存(ハードウェアやOS)を考慮する必要はないと思っていました。ただ、一部、環境依存で動作が異なるものもあるようです。
その1つが改行コード。OSによって改行を指示するための改行コードが異なるからなんですね。環境依存を排除するためには、以下のように改行コードを取得・設定する必要があります。
詳細は、以下記事をご覧ください。
【Java】環境依存せずに改行コードを取得・設定する方法 - Reasonable Code
まとめ
スッキリわかる Java入門 実践編 第2版 (スッキリシリーズ)、いいですね。
Java経験者でも学ぶことがいくつもあり、Javaのスキルアップにつながる良書でした。
1つ気になったところといえば、総まとめとしてなにかアプリケーションを作る章があれば読者のスキルアップによりつながるのではと感じました。本書の主人公は会計システムを作っているようだったので、それと紐つけると面白そうです。
良書であることは間違いないので、気になった方はぜひ手にとってみては。