#Java

staticファクトリーメソッドその1

More than 1 year has passed since last update.

新卒Androidエンジニアです。
EffectiveJavaを最近読んでいてstaticファクトリーメソッドと言うキーワードを知りました。

staticファクトリーメソッド

EffectiveJava曰く、

クラスのインスタンスを返す単なるstaticメソッド

とのことです。

例えば、Booleanクラスのコードの例を見てみると、

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

このメソッドはbooleanという基本データ値をBooleanオブジェクト参照へと変換しています。

通常、クラスのインスタンスをクライアントが得るためにはpublicなコンストラクタを通じる必要がありますが、staticファクトリーメソッドを用いれば、staticなメソッドを通じてインスタンスを得ることができます。

ちなみに、名前が似ていますがデザインパターンの一種であるファクトリーメソッドとは異なるので、混同しないように注意が必要です。

シングルトンに置けるstaticファクトリーメソッド

デザインパターンの話が出てきたのでついでに書いておくと、シングルトンパターンという

そのクラスのインスタンスが一つしか生成されないことを保証する

デザインパターンがあります。

これを実現するコードとして、Javaの場合よく以下のような書き方が見られるかと思います。

public class Singleton {

    private static Singleton singleton = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return singleton;
    }
}

この場合、getInstance()がstaticファクトリーメソッドになっています。
staticファクトリーメソッドのことを知らなかったとしても、シングルトンパターンを知っている人は多いかと思うので、この例でイメージはつくのではないかと思います。

メソッドの一般的な名前

各人がそれぞれ好き放題にメソッド名を決めてしまっては他のstaticメソッドと見分けがつかなくなってしまうため、命名規約もあります。
一般的には以下のメソッド名があります。

メソッド名 役割
valueOf パラメータと同じ値を持つインスタンスを返す。型変換。
of valueOfのvalueを抜いたメソッド名
getInstance パラメータで指定されたインスタンスを返すが、同じ値を持つとは言えない。シングルトンの場合は引数を取らず、唯一のインスタンスを返す。
newInstance getInstanceと似ているが、返されるインスタンスが全て別々のものである点が異なる。
getType getInstanceと似ているが、ファクトリーメソッドが対象のクラスと異なるクラスにある点が異なる。
newType newInstanceと似ているが、ファクトリーメソッドが対象のクラスと異なるクラスにある点が異なる。

使用しているクラスでこれらのstaticメソッドがあったら、staticファクトリーメソッドなんだなと気がつくことができます。

標準クラス(先ほどのBooleanなど)でも、これらのメソッドを見ることができます。

メリット

では、staticファクトリーメソッドを使うと何が嬉しいのか
それについては長くなってしまうのでその2にまとめたいと思います。
今回はここまで

参考

ジョシュア・ブロック 著 柴田 芳樹 訳 Effective Java 第二版