Effective Javaを学んだ個人的なまとめです。
結論
インスタンスの生成や利用を考えるときに、コンストラクタの利用を無意識に考えるのではなく、staticファクトリメソッドも検討に入れよう。
コンストラクタを利用する場合と比較してどのようなメリットとデメリットがあるのか。
👍 メリット
#####1.名前を持つことができる
コンストラクタはクラス名と同じであるため、任意の名前を持つことができない。staticメソッドの場合は、メソッドなのでその動作にあった名前をつけることができるためわかりやすい
#####2. インスタンスを生成する必要がない
キャッシュしているインスタンスの再利用をすることで不用意なインスタンスの生成を防ぎ、計算量、処理量を減らすことができる。(GoFデザインパターンのシングルトン)
#####3.任意のサブタイプのオブジェクトを返すことができる
#####4.返却するオブジェクトを入力によって変えることができる
コンストラクタと異なり、戻り値を任意に定められるため、型にあった任意のオブジェクトを返却することができる。
#####5.クラス作成時に返却されるオブジェクトのクラスがなくてもよい
ある種当たり前の話ですが、コンストラクタの存在のためにはクラスの定義が必要である。一方staticファクトリメソッドの場合はクラスが存在しなくてもよいため、柔軟な対応が可能となる。
👎 デメリット
#####1. publicあるいはprotectedのコンストラクタを持たないサブクラスを作れない
ただ逆に、継承ではなく、コンポジションを使うことをプログラマに促すことができるメリットもある。
#####2. staticファクトリメソッドを見つけるのが難しい
JavaDocが目立たせてくれない。ただ、IDEや命名規則によって解決することが可能ではある。