まくまくJavaノート
コンストラクタの代わりに static ファクトリメソッドを検討する
2016-02-05

static なファクトリメソッドを用意し、コンストラクタの代わりに使用することで、インスタンス生成に関するコードをより分かりやすくできることができます。

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

コンストラクタと異なり、分かりやすいメソッド名を付けることができる

Ramdom rand = new Random();
BigInteger.probablePrime(500, rand);

上記の BigInteger.probablePrime は、素数であろう数を返すファクトリメソッドです。 new BigInteger(...) というコンストラクタを呼び出すよりも、どのような BigInteger インスタンスを生成しているのかが明確に表現されています。

型変換用のファクトリメソッドなどは、慣習として valueOfof というメソッド名が使用されます。

Boolean b = Boolean.valueOf(true);

コンストラクタと異なり、メソッドを呼ぶ出すごとに必ずしも新しいインスタンスを作る必要がない

Service service = Service.getInstance();

上記の Service.getInstance() は、新しいインスタンスを生成するようにも実装できますし、効率化のために再利用可能なオブジェクトを返すように実装することもできます。 シングルトンクラスにおいては、効率化のためではなく、同一インスタンスを取得するためにこの形式のファクトリメソッドを用意します。

コンストラクタと異なり、戻り値となるオブジェクトを任意の具象クラスのオブジェクトとすることができる

オブジェクト指向の多態性を活用した設計を行うには、インタフェースによるメソッドアクセスが必要となります。 ファクトリメソッドにより、具象クラスのインスタンス化を隠ぺいすることができるので、呼び出し側では自然とインタフェースを利用したコーディングが行えるようになります。

public static Service createService(ServiceType type) {
    switch (type) {
        case FOO:
            return new FooService()
        case BAR:
            return new BarService();
        default:
            return new DefaultService();
    }
}

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

他の static メソッドと区別が付きにくい

static ファクトリメソッドは、通常の static メソッド(クラスメソッド)と同様の位置づけにあるため、コンストラクタに比べてインスタンス化方法を把握しにくいと言えます。 クラスの Javadoc コメントとして、インスタンス化方法を明示しておく必要があります。

2016-02-05