Categories: Java

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

enum(列挙型)とは

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

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

enum(列挙型)の書き方

構文

修飾子 enum 型名{ 列挙定数1,列挙定数名2,列挙定数名3;}

列挙定数のみ宣言した例

Java

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

Java

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

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

Java

public enum enumColor {
    RED,BLUE,GREEN,YELLOW,PINK;
    private int val = 100;
    private int num;
        void x(){
    }
}

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

Java

public enum enumColor {           //ここでコンパイルエラー。
    private int val = 100;
    private int num;
        void x(){
    }
    RED,BLUE,GREEN,YELLOW,PINK;
}

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

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

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

Java

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

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

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

Java

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

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

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

Java

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

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

Java

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

実行結果は以下のとおりです。

Java

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

Java

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メソッドを使用します。

Java

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

実行結果は以下のとおりです。

Java

RED: 0
BLUE: 1
GREEN: 2
YELLOW: 3
PINK: 4

列挙型で定数に任意の値を保持する

定数に任意の値を設定するには定数名(値)のように記述します。
また、値を取り出すにはゲッターを使用します。

Java

public enum EnumTest {
    DECEMBER(12),OCTOBER(10);
    private final int val;
    private EnumTest(int val){
        this.val = val;
    }
    private int getVal(){
        return val;
    }
    public static void main(String[] args){
        EnumTest DECEMBER = EnumTest.DECEMBER;
        System.out.println(DECEMBER.getVal());//12
        EnumTest OCTOBER = EnumTest.OCTOBER;
        System.out.println(OCTOBER.getVal());//10
    }
}

Enumで月を管理する例

Java


public enum sample {
    JANUARY("1月"),
    FEBRUARY("2月"),
    MARCH("3月"),
    APRIL("4月"),
    MAY("5月"),
    JUNE("6月"),
    JULY("7月"),
    AUGUST("8月"),
    SEPTEMBER("9月"),
    OCTOBER("10月"),
    NOVEMBER("11月"), 
    DECEMBER("12月");

    private final String str;

    private sample(String str){
        this.str = str;
    }

    public String getStr(){
        return this.str;
    }
    public static void main(String args[]){
        for(sample month : sample.values()){
            System.out.println(month.toString()+": "+ month.ordinal() +": "+  month.getStr());
        }
    }
}

実行結果


JANUARY: 0: 1月
FEBRUARY: 1: 2月
MARCH: 2: 3月
APRIL: 3: 4月
MAY: 4: 5月
JUNE: 5: 6月
JULY: 6: 7月
AUGUST: 7: 8月
SEPTEMBER: 8: 9月
OCTOBER: 9: 10月
NOVEMBER: 10: 11月
DECEMBER: 11: 12月

以上で記事の解説はお終い!

もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!

shiakisudev