野狐消暇録

所感を記す

『Effective Java』がめっちゃ勉強になる。

 

  • 概要

『Effective Java』を久しぶりに開いてみたら、心に響いた。

  • 詳細

『Effective Java』を購入したのは、何年も前の事で、その時の事はもう覚えていない。確か評判がいいと聞き、試しに買ってみたのだと思う。しかし、内容をあまり覚えていないから、おそらく難し過ぎて、そのまま読まなかったのだろう。

久方ぶりに開いた『Effective Java』は、Javaを2年位書きまくった僕の脳天に痛棒を食らわした。

「君、この位は分かっていたまえ。Javaは手続き型じゃないんだから」

『Effective Java』は、ちょっと上から目線でそう言った。

「この前君が書いていたコードだが、最初はHashMapで実装した。その理由は確か、KeyとValueを辞書のように使えれば良く、特に順序を考慮する必要はないから、だったね。だから君は、TreeMapを使わなかった。しかし、途中で、事情が変わり、Keyの昇順に並び替える必要が生じた。その時君はどうした? 一度全ての値をHashMapから取得し、ArrayListに格納した。そして、そのリストを並び替えた。つまり、TreeMapを使わなかった。なぜならもしその時からTreeMapに書き換えるとなると、修正箇所が多く、コードを書き変えるのが面倒だったからだ。しかしだ、それはなんでだと思う。修正箇所が多かったのは、止むを得ない事情でも何でもない。君の書き方が悪いからだ。君はHashMapを生成した後、そのインスタンスをHashMap型の変数に格納していた。しかし、Javaにはインターフェースという機能がある。Mapインターフェースにインスタンスを格納しておけば、インスタンスを生成する箇所で、生成するインスタンスのクラスをHashMapからTreeMapに修正するだけで良かった筈だ。そうすれば、Mapから取得したコレクションは、TreeMapクラスの力により、順序が保証されたのである。分かるか? 君が愚かだからだ。結論はそういう事だ」

 「Enumの書き方もそうだ。なぜそうやすやすとEnumでswitchしてしまうんだ。Enumにはもっと効果的な使い方がいくらでもある。switch文で分岐させる代わりに、Enum型の内部で抽象メソッドを宣言し、列挙定数ごとに抽象メソッドを実装したっていい。そうすれば、列挙定数を追加した時に、switch文にひとつ列挙定数を追加し忘れる事もない。またswitch文の最後に、定型的なエラーをスローする処理も書かないで済む」

「他にも言いたい事は山ほどあるが、今日はこの辺にしておこう。あまり一度に話しても混乱するだろうから」