はじめに
仕事で Java をつかうようになった.
来週から悪名だかき Javaer になる. pic.twitter.com/pfdExrE3nG
— きつね (@tsu_nera) 2014, 11 月 15
といっても, まだ 8 時間くらいしかプログラミングしてないんだけど・・・.
ここ一か月, 怒涛のようにブログの記事を書いているけれども, そのほとんどが Java に関する記事だ.
たとえば…
- Java のユーティリティクラスはシングルトンパターン/ フライウェイトパターンで実装する | Futurismo
- Java のリフレクションでインスタンスやメソッドを動的生成する | Futurismo
- 委譲のまとめと Strategy パターンの実装 (Java) | Futurismo
- エレガントな Effective Java の Builder Pattern を実装してみた | Futurismo
- Java でのジェネリックスの使い方まとめ | Futurismo
- Effective Java にのっている エレガントな Enum の使い方メモ | Futurismo
それは, 元ネタはほとんど Effective Java だったりする.
2 週間ちかくかかったけれども, ようやく読みきったので感想を書く.
内容の紹介
紹介といっても, あまりに有名な本なので紹介するまでもないかも..
Java をつかうプログラマ必読の書
と, よくネットで見かける.自分も, この誘い文句に惹かれて本を手に取った.
第 2 版 は Java 6 の仕様にそって, Java を使う上での有効なテクニックが 78 項目, 順に紹介されていく.
題名のとおり, Effective な Java 文法の使い方のカタログ. よいとされる Java の書き方が, なぜそうするべきなのか説明される.
- 第 2 章 オブジェクトの生成と消滅 (項目 1 〜 項目 7)
- 第 3 章 すべてのオブジェクトに共通のメソッド (項目 8 〜 項目 12)
- 第 4 章 クラスとインタフェース (項目 13 〜項目 22)
- 第 5 章 ジェネリックス (項目 23 〜 29)
- 第 6 章 enum とアノテーション (項目 30 〜 項目 37)
- 第 7 章 メソッド (項目 38 〜 項目 44)
- 第 8 章 プログラミング一般 (項目 45 〜 項目 56)
- 第 9 章 例外 (項目 57 〜 項目 65)
- 第 10 章 並行性 (項目 66 〜 項目 73)
- 第 11 章 シリアライズ (項目 74 〜 項目 78)
順番に読む必要はないので, 目次をみて気になったところからつまみ読みできる.
感想
Elegant java
まず, この本に乗っている手法はとてもエレガントだ.
関心して, かつ興奮することが毎日体験できる. 思わず写経して, 記事にしてしまうほど, 感動するのだ!
どんな風に感動したかは, 過去記事に譲る.
- エレガントな Effective Java の Builder Pattern を実装してみた | Futurismo
- Effective Java にのっている エレガントな Enum の使い方メモ | Futurismo
Elegant Java というタイトルでも十分通用する.
あたりまえのようにデザインパターンがでてくる
オブジェクト指向言語における, 美しいパターンが各ページにちりばめられている.
Gof のデザインパターンというものが, オブジェクト指向でよく利用されるパターンのカタログならば, Effective な手法と Gof のパターンがかぶってしまうことは当たり前.
出てきたものを, 思いつくままに抜粋.
- ファクトリーメソッド 項目 1
- ビルダー 項目 2
- シングルトン 項目 3
- デコレータ 項目 16
- ブリッジ 項目 18
- ストラテジ 項目 21
- アダプタ 項目 22
- オブザーバ 項目 67
- フライウェイト 項目 71
継承をやたら敵対視
とくに印象的だったのが, 以下の章だ.
- 第 4 章 クラスとインタフェース (項目 13 〜項目 22)
- 第 6 章 enum とアノテーション (項目 30 〜 項目 37)
Enum は別記事に譲るとして, ここではインタフェースについてのコメントを抜粋.
-
継承よりもコンポジションを選ぶ 継承は不必要なメソッドを公開する. つまり, 継承はカプセル化を破る.
-
継承をつかうならば設計を文書化する, でなければ禁止だ.
-
抽象クラスよりもインタフェースを選ぶ 実装の観点では,
- 抽象クラスはメソッドに対する実装を含むことを許されている.
- インタフェースはメソッドに対する実装を含むことを許されていない.
機能の観点では,
- 抽象クラスはある機能の実装を強制する.
- インタフェースは任意の機能を混ぜ合わせる.
階層化の観点では,
- 抽象クラスは物事を階層化することに優れる.
- インタフェースは階層を持たないものをまとめることに優れる.
-
インタフェースは, 階層を持たない型システムを構築する.
おわりに
とてもよい読後感だ.
いいエンディングの映画をみたように, ここに掲載されている手法の美しさに心を打たれた.
各項目が細かく分類されているのもよい. Java での実装に困ったとき, 折に触れて読み返そうと思った.