「常に」ファクトリーメソッドにするべきか?

ファクトリーメソッドのメリット

  • 毎回インスタンス生成しなくてもいい
    • Flyweight パターンの様にキャッシュ
  • コンストラクタではジェネリクス引数の型を記述しなければならないが、メソッドなら引数の型を勝手に推論してくれるので記述する必要がない(C++ と同じ)
    • …というのは Java 6 以前の話で、Java 7 からは new HashMap<>() のように省略できるようになった
  • メソッド名に意味を与えられる
    • 例:Optional#of()、Optional#ofNullable()
    • コンストラクタだと引数の変数名で意味を表明できる程度の表現力しかない
  • そもそも物自体がその「物」の構築方法を知っているのは(オブジェクト指向的に)おかしいよ派
    • いやいやクラスは「設計図」なんだから何もおかしくはないよ派

CDI

  • コンストラクタでインスタンス構築しても、CDI を使っていればファクトリーと同じメリットが得られる?
  • Flyweight パターンの様にキャッシュするのはどうやって CDI で書けばいい?
  • 解決策:@Singleton や @ApplicationScoped を付ける
  • もっと細かくキャッシュの対象を制御したい場合には?
    • @Dependent にして通常の Flyweight パターンで実装するのがいいのでは
    • @Dependent って要は通常のクラス生成と同じライフサイクル(injection point で new するのと同じ)