Help us understand the problem. What is going on with this article?

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

新卒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 第二版

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away