0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Effective Java(第3版) 項目1 コンストラクタの代わりにstaticファクトリメソッドを検討する

Posted at

使用者がクラスのインスタンスを生成出来るようにするために、publicコンストラクタの代わりにstaticなインスタンス生成メソッドを提供することを検討するべき、という内容です。

記載内容

メリット

以下の5つのメリットが挙げられています

  1. 名前を付けられる
  2. 呼び出しごとに新たなインスタンスを生成する必要が無い
  3. 戻り値型の任意のサブタイプのインスタンスを返すことが出来る
  4. 引数に応じて、返すインスタンスの型を変えらえる
  5. 返されるオブジェクトのクラスは、ファクトリメソッドが書かれた時点で実装されている必要が無い

デメリット

以下の2つのデメリットが挙げられています

  1. サブクラスが作れない
  2. プログラマがインスタンスの生成方法を見つけるのが難しい

考察

メリットについて

ファクトリメソッドは特に不変クラスと相性が良いと思います。
特に「呼び出しごとに新たなインスタンスを生成する必要が無い」は、
実装当初は毎回インスタンスを生成していても、将来、インスタンスのキャッシュ等を追加できます。
(コンストラクタをpublicで公開してしまったら、利用側のコードを修正しないとなりません)

返すインスタンス型に関する3つのメリットは、インタフェースにstaticファクトリメソッドを定義すると、より良いかもしれません。
定義としてはインタフェース自身を返すように記載しておき、実際に返すのは、パッケージプライベートの実装クラスにしておけば、
利用側に実装クラスを隠すことが出来、将来の拡張が容易になります。

デメリットについて

デメリットの1つ目「サブクラスが作れない」は問題ないと思われます。
機能追加時に、継承よりもコンポジションを選択すれば良いためです。
(むしろメリットだと思えるくらいです)

「プログラマがインスタンスの生成方法を見つけるのが難しい」は少し問題です。
IDEの助けがあっても、
ファクトリメソッドの名前が分かりづらかったり、JavaDocの記載が不十分だったりすると、
適切な生成方法を見つけるのが難しくなりそうです。
9ページの命名規約は確認しておいたほうが良いです。

まとめ

特に、不変クラスを作成しているのであれば、ファクトリメソッドの提供(および、コンストラクタを非publicにすること)を検討したほうが良いと思います。
提供する場合は、命名規約に注意するべきです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?