Effective Javaを読むチャレンジ-項目1-

Effective Javaは2001年初版のJava本のベストセラーでして、2014年に第2版の日本語訳が出版されました。おそらく原著では執筆時点でJavaはSE 6まで(2015年12月現在はSE 8)バージョンアップしていて、その差を補完した形でパワーアップしています。

初版を何年か前に初めて読んだとき、最後まで読めずに挫折しました。まず前提とする知識が多すぎるのと、後述の項目を参照しなきゃいけなくて本の中を行ったり来たりで何を知りたかったのか頭から飛んでしまう。

今回はとにかく目を通すところから始めようということで、よく分からなかった部分や覚えておきたい所をブログにまとめてあとで見るために使おうという意図です。

項目1 コンストラクタの代わりにstaticファクトリーメソッドを検討する

staticファクトリーメソッドとデザインパターンのファクトリメソッドとは同じではない

何が違うのか明確に説明できない・・・項目1で一番頭悩ませてる記述です。

staticファクトリーメソッドの長所3

フレームワークを提供する場合、インターフェースのみをpublic、すなわち公開してその実装クラスを隠ぺいしたいことがあります。staticファクトリーメソッドを使うと、実装クラスを公開せずに外部からインスタンス生成できるようになると。

その例としてコレクションフレームワークやその中のjava.util.EnumSet、サービスプロバイダーの話をしてますね。インターフェースの制限に則ってさえいれば、複数のプロバイダーが実装するAPIを1つのインターフェースで提供できます。

・・・デザインパターンのファクトリメソッドは外部に対して実装クラスを隠ぺいできないんでしたっけ?

staticファクトリーメソッドの長所4

Java SE 7からダイアモンド構文が追加されました。以下のような感じ。

<>というのはダイアモンド演算子と呼ばれ、総称型のパラメータの省略形ですね。コンパイラがコンストラクタの型推定をしてくれるようになりました。Java SE 8以降はメソッドの引数や三項演算子でも可能です。

というわけでこれに関しては現在では長所にはならないのかなあと思います。

staticファクトリーメソッドの短所1

staticメソッドはクラス単位に管理されるので確かに継承できないですね。コンポジションなら、確かに。

短所2 他のstaticメソッドと区別がつかない

SE 8のOracle Documentation見ても、区別はつきません。現在でもメソッドは定義されたとおりに単純に並んでます。

staticファクトリメソッドの主な命名規則は覚えておきたい。

  • valueOf, of・・・引数と同じ値のインスタンスを返す。ofはvalueOfの省略形。
  • getInstance・・・引数と同じインスタンスを返すが同じ値とは限らない。
  • newInstance・・・引数と異なるインスタンスを返す。
  • getType・・・getInstanceを別のクラスで定義する場合。Typeは戻り値の型。getMapとか。
  • newType・・・newInstanceを別のクラスで定義する場合。Typeは戻り値の型。newListとか。
広告
  • LINEで送る