はじめに
皆さん。こんにちは!
DreamHanksの254cmです。
今回はenumについて説明していきます。
Java記事のまとめはこちらです。
前回の記事は【Java開発】第24回 Collection Frameworkです。
enumとは?
enumはJava5から追加されたものであり、定数の集合を意味します。
final staticキーワードを利用しても定数を定義することができますが、
enumは作成方法がすごく簡単なので、可読性が高いです。
そして、enumもクラスの一つなので、定数のデータ型を定義することができます。
つまり、意図した定数値だけを代入することができる変数を生成できます。
enumの書き方
〇enumクラスの定義
1 2 3 |
アクセス制御子 enum クラス名 { 定数名、定数名、定数名 } |
上記のようにenumクラスで定義される定数はアクセス制御子も、データ型もいりません。
ただ、定数の名前たけ定義すればいいです。
上記のように定義された定数は名前と同じような文字列のように使えます。
サンプル
1 2 3 4 |
public enum EnumSample1 { english, 日本語 } |
上記のように別途の.javaファイルでenumを定義することができます。
定数名はunicodeの文字を使うことができますが、命名規約に従って英語の大文字で作成することを推奨します。
サンプル2
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class ExampleCalss { public static void main(String[] args) { Fruits fruits = Fruits.ブドウ; System.out.println(fruits); } } enum Fruits { apple, BANANA, ブドウ } |
上記のように他のクラスと同じファイルで作成することもできます。
定数の使用は上記のようにenumクラスのオブジェクトを生成して使います。
出力結果
1 |
ブドウ |
サンプル3
1 2 3 4 5 6 7 8 9 10 11 |
public class ExampleCalss { public enum Samples { SAMPLE1,SAMPLE2,SAMPLE3 } public static void main(String[] args) { System.out.println(Samples.SAMPLE1); System.out.println(Samples.SAMPLE2); System.out.println(Samples.SAMPLE3); } } |
上記のようにクラスのフィールドとして作成することもできます。
〇enumの定数に値を付与
1 2 3 4 5 6 |
public enum Sample { 定数名(値), 定数名(値), 定数名(値); } |
enumの定数に値を定義するためには括弧を追加して、その中に値を作成するといいです。
しかし、定数に値を格納するフィールドとコンストラクタおよび該当フィールド変数のgetメソッドを作成する必要があります。
サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class ExampleCalss { public enum Samples { SAMPLE1(1),SAMPLE2(5),SAMPLE3(3); private final int value; private Samples(int value) { this.value = value; } public int getValue() { return value; } } public static void main(String[] args) { System.out.println(Samples.SAMPLE1); System.out.println(Samples.SAMPLE2); System.out.println(Samples.SAMPLE3); System.out.println(Samples.SAMPLE1.getValue()); System.out.println(Samples.SAMPLE2.getValue()); System.out.println(Samples.SAMPLE3.getValue()); } } |
上記のように定数の値を格納するフィールドとコンストラクタ、getメソッドを作成しなければなりません。
出力結果
1 2 3 4 5 6 |
SAMPLE1 SAMPLE2 SAMPLE3 1 5 3 |
enumの主なメソッド
すべてのenumは「java.lang.Enum」クラスを継承しています。
なので、enumはEnumクラスのメソッドを使うことができます。
サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
public class ExcuteClass { public enum EnumSample { ENUM1(10), ENUM2(15), ENUM3(20), ENUM4(25); private int value; private EnumSample(int value) { this.value = value; } public int getValue() { return value; } } public static void main(String[] args) { EnumSample[] enums = EnumSample.values(); for(EnumSample sam : enums) { System.out.println(sam + " " +sam.getValue()); } EnumSample enumItem = EnumSample.valueOf("ENUM3"); String enumName = enumItem.name(); int enumValue = enumItem.getValue(); int enumIndex = enumItem.ordinal(); System.out.println(enumName + " is " + enumValue); System.out.println("index of "+ enumName + " is "+ enumIndex); } } |
出力結果
1 2 3 4 5 6 |
ENUM1 10 ENUM2 15 ENUM3 20 ENUM4 25 ENUM3 is 20 index of ENUM3 is 2 |
enumの長点
enumは可読性が高いこと以外にも色んな長点があります。
final staticで宣言した定数を使用することよりいいところをサンプルを見ながら説明します。
サンプル1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
public class ExampleCalss { final static int ITEM1 = 1; final static int ITEM2 = 1; public enum Samples { SAMPLE1(1),SAMPLE2(1); private final int value; private Samples(int value) { this.value = value; } public int getValue() { return value; } } public static void main(String[] args) { Samples sample1 = Samples.SAMPLE1; Samples sample2 = Samples.SAMPLE2; if(sample1 == sample2) { System.out.println("sample1 == sample2"); } else { System.out.println("sample1 != sample2"); } if(sample1.equals(sample2)) { System.out.println("sample1 equals sample2"); } else { System.out.println("sample1 not equals sample2"); } if(sample1.getValue() == sample2.getValue()) { System.out.println("sample1.getValue() == sample2.getValue()"); } else { System.out.println("sample1.getValue() != sample2.getValue()"); } if(ITEM1 == ITEM2) { System.out.println("ITEM1 == ITEM2"); } else { System.out.println("ITEM1 != ITEM2"); } } } |
上記のサンプルのように整数型の定数の場合、二つの情報に対する定数を宣言しましたが、
値が同じである場合、データの意味は異なりますが、ソースコード上では同じ情報として認識されます。
しかし、enumの定数は同じ値を持つ二つの定数を異なる定数で認識されます。
出力結果
1 2 3 4 |
sample1 != sample2 sample1 not equals sample2 sample1.getValue() == sample2.getValue() ITEM1 == ITEM2 |
サンプル2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public class ExampleCalss { final static String ITEM1 = "red"; final static String ITEM2 = "blue"; public enum Samples { SAMPLE1("red"),SAMPLE2("blue"); private final String value; private Samples(String value) { this.value = value; } public String getValue() { return value; } } public static void main(String[] args) { String item = ITEM1; item = ITEM2; item = "green"; Samples enumItem = Samples.SAMPLE1; enumItem = Samples.SAMPLE2; enumItem = "green"; } } |
上記のサンプルのようにfinal staticで定義した定数を他の変数の値として代入する場合、
代入される変数は定数ではない、意図されていない値も代入することができます。
しかし、enumクラスのオブジェクトの場合、意図されていない値を代入することができません。
終わりに
今回の記事は以上になります。
次回はObjectクラスを学びましょう。
ご覧いただきありがとうございます。
コメント