てくてくテック☆

千里の道も一歩から。テック(Tech)の道をてくてく歩く。

「Java ルールブック ~ 読みやすく効率的なコードの原則」を読んで

Java のコーディング規約的なものを扱っていて、
かつ、初心者でもとっつきやすい本はないか、ということで。

Java ルールブック ~ 読みやすく効率的なコードの原則」という本を
読んでみました。

Javaルールブック ?読みやすく効率的なコードの原則

Javaルールブック ?読みやすく効率的なコードの原則

全体的な印象

  • 短い時間でさらっと読める
    • (知ってる内容が結構あったのも大きいかもだけど)通勤 1 往復程度で読了
  • ルールに対する違反例と修正例がサンプルコードとして載っていて分かりやすい
    • 対比できるのがいい!
  • 全体的に文字もじしすぎてなくて初心者でも手に取りやすい
    • 特にサンプルコードの文字が大きめで説明に埋もれてしまわない
    • 全体的に見やすい!
  • 範囲が多岐に渡る(文法やクラス継承、マルチスレッドなど)
    • 一通りやったことがある人向け?

細かいところとしては「いいね!」って素直に思える部分と
初版が 2011 年でちょっと古いせいもあるのか、
「モヤッと」疑心暗鬼な部分があったので、
とりあえず、メモしておきます。
( 「モヤッと」については実際のところどうなのか、細かく調査していきたい。。

いいね! なところ

  • 符号の向きは左向き("<"、"<=")にする
    • 意識してやったことはないですが、こういうルールは個人的に好きです
  • java.lang パッケージはインポートしない
    • 正直に言うと、これ知りませんでした。。
    • なんで java.lang だけ特別なのか、気になりますが。
  • 戻り値が配列や Collection の場合、null を返さない
    • 意識が甘いときがあったかも、と不安になったので戒めとして。
  • 文字列の連結には StringBuilde クラスを利用する
    • これ、(確か)「パーフェクト Java」でも見た気が。。
  • システム依存記号(\n、\r など)は使用しない
    • 必要に迫られなかったとはいえ、目から鱗
    • System.getProperty() 。。覚えておこう。
  • 誤差なく計算したいときは、BigDecimal クラスを使う
    • 金額計算とか使ってた理由が今さら分かった。。
  • 補助文字を使用する場合は、String#length() と String#charAt() を使わない
    • 必要に迫られなかったとはいえ、補助文字は扱ったことあるので覚書として。
  • Cloneable#clone() を使わず、自前のコピーメソッドを利用する
    • シャローコピーとディープコピーのお話
  • キャスト処理は instanceof で囲む
    • 囲むのを徹底して意識できてなかったと思う。。これも戒め
  • 車輪の再発明をしない
    • ルールじゃなくて、(コラム的な)MEMO から抜粋
  • ロギングライブラリを使おう
    • これも MEMO から抜粋
    • つい標準入出力使っちゃうところがあるので戒め。。
  • wait()、notify()、notifyAll() は syncronized ブロックの中で利用する
    • 苦手なマルチスレッド。。自分への覚書です。
  • wait() メソッドの後で前提条件を再確認する
    • wait() する条件は if 文じゃなく、while 文にする
  • 処理の待ち合わせにはポーリングループを利用せずに CountDownLatch などの既存の仕組みを利用する
    • CountDownLatch を知らなかったので、備忘録として残しときます
  • マルチスレッド環境下では ConcurrentHashMap や CopyOnWriteArrayList を使う
    • これも使ったことが(おそらく)ないので、備忘録として残しときます

モヤッと、なところ

  • インタフェース名と実装クラス名の対応関係を明確にする
    • XXX インタフェースの実装クラスは XXXImpl にする、というやつ
    • インタフェースと実装クラスが 1 対 1 じゃない場合はどうなの?と思ったので。。
  • 条件分岐では、「!」を使わない
    • わりと良く使ってました。。一般的にはどうなのか、ちょっと知りたい。
  • Date、Calendar の代わりに long の利用を検討する
    • もやっと、というよりは Java SE 8 とあわせて見直したい
  • 時間の単位変換には TimeUnit を使う
    • これも 1 つ上と同様に Java SE 8 とあわせて見直したい
  • static インポートは利用するかどうかを統一する
    • 過去に統一できてなかった思い出が。。
    • もやっと、というよりはどちらが一般的なのか気になる。
  • Java 2 以降のコレクションクラスを利用する
    • Vector とか使ってないけど、なぜダメなのかを深堀したい
  • wait() メソッドの後で前提条件を再確認する
    • 「スプリアスウェイクアップ」をさらっと調べてみたけど、有用な情報が得られなかった。。