列挙型は継承ができない

列挙型をいくつも作成して、そこに似たようなメソッドを定義していると、「列挙型も継承できたらいいのに」と思ってしまう。が、残念ながら、列挙型は継承ができない。それも当然で、abstract な列挙型なんてありえない。仕方ないなあ。

ただ、インタフェースの実装はできるので、これを活用するのが正解。

public interface Foo {
    public int getNumber();
}

というインタフェースを定義しておいて、

public enum FooEnum implements Foo {

ONE (1), TWO (2), THREE (3);
private int number;
private FooEnum (int arg0) { this.number = arg0; }
/* (non-Javadoc) * @see Foo#getNumber() */ @Override public int getNumber() { return number; } }

という感じで、列挙型を定義してあげる。

public class Sample {
    public static void main(String[] args) {
        for (Foo foo : FooEnum.values()) {
            System.out.println(foo.getNumber());
        }
    }
}

実際にこんな感じでインタフェースプログラミングができる。

Foo インタフェースを実装した列挙型を量産する際に、いちいちコンストラクタとフィールドを用意するのが、非常にかったるいわけだけど、その列挙型ではそこを意識しなくて良くなるから、それがせめてもの救い。

ちなみに、列挙型って1.xあたりでの java 育ちな人には、あんまり積極活用されていないような気がする。文化として根付かないのかな。スゴイ便利なんだけどなあ。

このエントリーのトラックバックURL
http://www.deftrash.com/admin/mt4/mt-tb.cgi/469