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("日本", "太郎");

今日のところは、とりあえず以上。