このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ

staticファクトリーメソッド

  • java.util.EnumSetはpublicのコンストラクタは持っておらず、staticファクトリメソッドだけを持っている。
    • 実際のenum型の大きさに応じて、2つある実装(これはクライアントには見えない)のどちらかを返す。

利点と欠点

  • 利点
    • コンストラクタと異なり、名前を持つ。
    • クラスは特定のシグニチャを持つコンストラクタは1つしか持てないが、staticファクトリーメソッドを使えば、その制限なしに同等の機能を実現できる。
    • コンストラクタと異なり、メソッドが呼び出されるごとに新たなオブジェクトを生成する必要がない。
    • 何度呼び出されても同じオブジェクトを返すことができるので、ある時点でどのようなインスタンスが存在するかを厳密に制御できる。
      • この制御を行うクラスをインスタンス制御されているという。
      • インスタンス制御により、クラスがシングルトンあるいはインスタンス化不可能であることを保障できる。また不変なクラスに2つのインスタンスが存在しないことを保証できる。
    • コンストラクタと異なり、メソッドの戻り値型の任意のサブタイプのオブジェクトでも返すことができる。
      • 返すオブジェクトのクラスをpublicにすることなく、APIがオブジェクトを返すことができる。この技法はインタフェースに基づくフレームワークと親和性が高い。
    • パラメータ化された型のインスタンス生成の面倒さを軽減させる。
  • 欠点
    • public/protectedのコンストラクタを持たないクラスのサブクラスを作れない。
    • 容易に他のstaticメソッドと区別しにくい。

参考文献

  • 『Effective Java』