staticファクトリーメソッドの長所 その1
通常、対象のクラスをインスタンス化する方法は、publicなコンストラクタを提供する。
その他の提供方法として、今回紹介する「staticファクトリーメソッド」がある。 単純なコード例は以下。(staticファクトリーメソッドは、newInstanceメソッド)
public class Name { private final String value; private Name(String value){ this.value = value; } public static Name newInstance(String value){ return new Name(value); } }
publicなコンストラクタの代わりに、staticファクトリーメソッドを提供したときの長所をまとめちゃいます。 今回は1つ目です。
コンストラクタと違い、メソッド名に名前を持つことができる
例えば、クラスのコンストラクタが複数定義されている場合、クラスの利用者側がコンストラクタに渡すパラメータリストの違いを把握して、使い分ける必要がある。 これだと、利用者側の負担が増える、利用者側のコードの可読性が落ちるだけなので使いやすいクラスになっていない。
そこで、定義されているコンストラクタごとに、メソッド名で違いをわかるようにして、利用者側の負担を減らしてあげましょう。
例えば、氏名のクラスからコンストラクタが2つ提供されているケースを考えてみよう。
- 姓名を一つの引数でもらう
- 姓名を別々の引数でもらう
通常のコンストラクタで提供するなら、以下のようになる。
public class Name { private final String value; public Name(String fullName){ this.value = fullName; } public Name(String lastName, String firstName){ this.value = lastName + firstName; } }
staticファクトリーメソッドで提供するなら、以下のようになる。
public class Name { private final String value; private Name(String fullName){ this.value = fullName; } public static Name newInstanceForFullName(String fullName){ return new Name(fullName); } public static Name newInstanceForLastNameAndFirstName(String lastName, String firstName){ return new Name(lastName + firstName); } }
利用者側のコードを書いてみると、以下のようになる。 スタティックメソッドのほうが、可読性が高いことがわかる。
// 通常コンストラクタの場合 Name name1 = new Name("日本太郎"); Name name2 = new Name("日本", "太郎"); // スタティックメソッドの場合 Name name1 = Name.newInstanceForFullName("日本太郎"); Name name2 = Name.newInstanceForLastNameAndFirstName("日本", "太郎");
今日のところは、とりあえず以上。