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がオススメ!同僚に差をつけよう!