頭脳一式

人の記憶なんて曖昧なもの。すべての情報を頭に記憶するなんてナンセンス。困ったらここに来ればいいじゃん?というスタンスで最強のナレッジベースを目指すブログ

【Java】enum(列挙型)の書き方

enum(列挙型)とは

複数の定数を1つにまとめてグループ化することができる型のこと。
Javaenum(列挙型)はフィールドやメソッドを宣言することが可能。
要点をまとめると以下のとおり。

  • 列挙定数は、デフォルトで0からの序数が割り当てられる。(配列等で云うIndexみたいなもの)
  • 列挙定数のみ宣言する場合は、最後の列挙定数の末尾にセミコロンは付けても付けなくても良い。
  • 但し、列挙定数の他にフィールドやメソッドも宣言する場合は、最後の列挙定数の末尾にセミコロンが必須。
  • フィールドやメソッドも宣言する場合は、列挙定数はそれらよりも手前に宣言しなければならない。
  • 列挙定数は暗黙的にpublic static finalなメンバーとなるため、修飾子を付けることはできない。
  • 列挙型自体はアクセス修飾子のみ付けることが可能。
  • 列挙型は暗黙的にjava.lang.Enumクラスを継承しているためクラスを継承(extends)することができない。
    但し、インターフェースは実装(implements)することが可能。
  • 列挙型はprivate型のコンストラクタしか宣言できない。それ以外の修飾子はコンパイルエラーになる。

enum(列挙型)の書き方

【構文】
修飾子 enum 型名{ 列挙定数1,列挙定数名2,列挙定数名3;}
★列挙定数のみ宣言した例

public enum enumColor {
    RED,BLUE,GREEN;  //最後の定数の後ろにセミコロンを付けた例。
}
public enum enumColor {
    DOG,CAT,COW      //最後の定数の後ろにセミコロンを付けない例。
}

★列挙定数の他にフィールドおよびメソッドを宣言した例

public enum enumColor {
    RED,BLUE,GREEN,YELLOW,PINK;

    private int val = 100;
    private int num;

    void x(){
        
    }
}

★列挙定数よりも先にフィールドやメソッドを宣言した例(コンパイルエラー)

public enum enumColor {           //ここでコンパイルエラー。

    private int val = 100;
    private int num;

    void x(){

    }
    RED,BLUE,GREEN,YELLOW,PINK;
}

列挙定数名を取得する方法

1.nameメソッドを使用する。

スーパークラスであるEnumクラスが、列挙定数名を文字列として取得するために提供しているnameメソッドを使用する方法。

public class test {

    public static void main(String[] args) {
        String color = enumColor.RED.name();
        System.out.println(color);            //REDが返る。
    }
}

2.toStringメソッドを使用する。

同じくスーパークラスであるEnumクラスがオーバーライドしているtoStringメソッドを使用する方法。

public class test {

    public static void main(String[] args) {
        String color = enumColor.RED.toString();
        System.out.println(color);            //REDが返る。
    }
}

文字列から列挙型インスタンスを取得する方法

文字列から列挙型インスタンスを取得するにはvalueOfメソッドを使用します。
この動きはコレクションでcontainsメソッドを使うのに似ています。

public class test {

    public static void main(String[] args) {
        enumColor color = enumColor.valueOf("RED");
        System.out.println(color);            //REDが返る。
    }
}

存在しない文字列を指定した場合は、コンパイルエラーにならず実行時にIllegalArgumentExceptionが発生します。

public class test {

    public static void main(String[] args) {
        enumColor color = enumColor.valueOf("BLACK"); //これは例外。
        System.out.println(color);
    }
}


Exception in thread "main" java.lang.IllegalArgumentException: No enum constant enumColor.BLACK
    at java.lang.Enum.valueOf(Enum.java:238)
    at enumColor.valueOf(enumColor.java:1)
    at test.main(test.java:4)

引数を2つ取るvalueOfメソッド

実はvalueOfメソッドには引数と2つ取るものがあります。
第1引数に指定したenum型の中に第2引数で指定した列挙定数があればそれを返します。
無ければ実行時にIllegalArgumentExceptionが発生します。

public class test {

    public static void main(String[] args) {
        enumColor color = java.lang.Enum.valueOf(enumColor.class, "YELLOW");
        System.out.println(color.toString());     //YELLOWが返る。
    }
}

列挙型の序数を取得する方法

同じくスーパークラスであるEnumクラスが持つordinalメソッドを使用します。

public class test {

    public static void main(String[] args) {
        int i = enumColor.PINK.ordinal();
        System.out.println(i);               //4が返る。
    }
}

列挙型の配列を取得する方法

同じくスーパークラスであるEnumクラスが持つvaluesメソッドを使用します。

public class test {

    public static void main(String[] args) {
        for(enumColor color : enumColor.values()){
            System.out.println(color.toString()+": "+ color.ordinal());
        }
    }
}

【実行結果】
RED: 0
BLUE: 1
GREEN: 2
YELLOW: 3
PINK: 4