プログラム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型は継承が出来ない。
 
何故って、enum型は暗黙のうちにEnumクラスの拡張クラスだから。
JAVAは単一継承なのでスーパークラスは二つも持てない。(もちろんインターフェースの実装はできるよん。)
 
こういうのはデータを保持したりするクラスに使ったりすることが多い。
そういうときにハッシュマップを使うときもあるだろう。
そのときハッシュマップを継承できなかったら、面倒くさいぞ。(getやpushの関数を全て作り直すのかい?)
その場合は普通にシングルトンパターンを使った方が気楽に使える。
 
 
中々便利っぽそうなenumの使い方ですが、こちらが一般的になったりはしないだろうなぁ。