Javaのstaticファクトリーメソッドについて

Effective Javaを読んでいたところ、とても重要そうなテクニックを見つけたのでメモしておく。
 

staticファクトリーメソッドとは

staticファクトリーメソッドとは、オブジェクトを返す単なるstaticのメソッドである。
通常、クラスのインスタンスはコンストラクタが提供するが、代わりにstaticなメソッドでオブジェクトを提供する方法もある。無意識にコンストラクタでインスタンスの提供を行わないように注意したい。
※staticファクトリーメソッドは、デザインパターンのファクトリーメソッド(Factory Method)ではないので注意。
 

public static Boolean valueOf(boolean b) {
    return b ? Boolean.TRUE : Boolean.FALSE;
}

 

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

長所

コンストラクタと異なり、名前を持つ

コンストラクタに対するパラメータ自身が、返されるオブジェクトを表現していない場合には、適切な名前を持つstaticファクトリーメソッドは使いやすく、その結果、クライアントのコードは読みやすくなる。

コンストラクタと異なり、メソッドが呼び出されるごとに新たなオブジェクトを生成する必要がない

これにより、あらかじめ生成しておいたインスタンスを使用したり、オブジェクトが生成された時にインスタンスをキャッシュして、そのインスタンスを繰り返し使用することで、不必要に重複したインスタンスの生成を回避できる。

コンストラクタと異なり、メソッドの戻り値型の任意のサブタイプのオブジェクトでも返すことができる

例えば、返すオブジェクトのクラスをpublicにすることなく、APIがオブジェクトを返すことが出来る。このような方法により、実装クラスを隠蔽することで、大変簡潔なAPIとなる。

パラメータ化された型のインスタンス生成の面倒さを低減することが出来る

文脈から明らかであるにも関わらず、パラメータ化されたクラスのコンストラクタを呼び出す場合には、あいにく型パラメータを指定しなければならない。その為、通常は型パラメータを2回続けて提供する必要がある。
 

Map<String, List<String>> m = new HashMap<String, List<String>>();

上記の冗長な指定方法は、型パラメータの長さと複雑さが増すに従って、すぐに苦痛になる。
しかし、staticファクトリーメソッドでは、コンパイラが型パラメータを見つけてくれる。これは、型推定と呼ばれる。
 

public static <K, V> HashMap<K, V> newInstance() {
    return new HashMap<K, V>();
}
Map<String, List<String>> m = HashMap.newInstance();

 

短所

public、もしくはprotectedで宣言されたコンストラクタを持たないクラスのサブクラスは作れない

 

staticファクトリーメソッドが容易に他のstaticメソッドと区別がつかない

staticファクトリーメソッドは、コンストラクタのようにはAPIドキュメンテーション内で目立たない。そのため、コンストラクタの代わりにstaticファクトリーメソッドを提供しているクラスのインスタンス化の方法を、クラスのドキュメンテーションから知ることが困難になることがある。
 

よくあるstaticファクトリーメソッド

よくあるstaticファクトリーメソッドの名前と役割は以下のようになっている。
 

名前 役割
valueOf パラメータと同じ値を持つインスタンスを返す。実質的に型変換メソッドである。
of valueOfの代替。より簡潔にしたもの。
getInstance パラメータで指定されたインスタンスを返すが、同じ値を持つとは言えない。シングルトンの場合には、getInstanceは何も引数を取らず、その唯一のインスタンスが返される。
newInstance getInstanceに似ているが、newInstanceは返される個々のインスタンスは、すべて別々のインスタンスである点が異なる。
getType getInstanceに似ているが、ファクトリーメソッドが対象のクラスと異なるクラスにある場合に使用され。Typeはファクトリーメソッドから返されるオブジェクトの型を示す。
newType newInstanceに似ているが、ファクトリーメソッドが対象のクラスと異なるクラスにある場合に使用される。Typeはファクトリーメソッドから返されるオブジェクトの型を示す。

 
 
以上
 
 
参考
書籍 Effective Java
staticファクトリーメソッド – はっきりいうと、このBlogのテーマはありふれたテーマ―― 「プログラミング」です。

Article written by

Comments are closed, but trackbacks and pingbacks are open.