プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

Enum型でシングルトンパターン

ちょっと見つけたので、メモ。
クラスの唯一のオブジェクトを作り、それ以外は作らせたくない場面というのは多々ある。そういうときに一般的に使われているのはシングルトンパターンという物だが、enumを使うとそれの代貸となる。
 
以下のように、値を一つしか持たないenum型を作成すると確かに作成できる。

public enum Param{
    PARAM;
    private String str;
    private int n;
    public void setString(String s){str = s;}
    public void setNum(int k){n = k;}
    public String getString(){return str;}
    public int getNum(){return n;}
}

後は普通にシングルトンパターンを利用するときのようにstaticインポートしておいて、こんな感じに使えばいい

import static Param.PARAM;
public class Test{
    public static void main(String[] s){
        PARAM.setString("ok");
        PARAM.setNum(-1);
        System.out.println(PARAM.getString()+PARAM.getNum());
    }
}

 これが書いてあった本では、この方法で作ると他のインスタンスを作成したりすることに対し言語レベルで強固なプロテクトをかけられ、シングルトンパターンよりenumを使うことを推奨していた。シングルトンパターンを書くよりもすっきり書けて好印象。

 けど、enumは継承が出来ないという点において、何かから継承したクラスをシングルトン化したい場合にはちょっと不向きなのがあれかなぁ。
 JavaもMixinができればいいんだけどね。(※7後年の追記:InterfaceでMixin的なことが出来る様になりましたね。)