【Java】enum(列挙型)とは?使い方をサンプルコードで徹底解説!
enumはあるデータの種類を表すのに使い、列挙型とも呼ばれています。
enumは特殊なクラスで、そのクラスはObject型のサブクラスであるように、すべての「enum」は、あるデータの Enum型のサブクラスになります。
また、enumはswitch文と組み合わせることで、コードが読みやすく、スマートになります。
また、意図のない数値を渡される可能性がなくなりますのでenumはぜひ覚えておきましょう。
今回は
・ enumとは
・ enumを使った場合
・ enumを使わなかった場合
・ アクセス指定子を使った場合
について解説していきます。
enumとは
enumとは、列挙型とも呼ばれており、複数の定数をひとつにまとめておくことができる型のことです。
enumの書き方
enumの構文は下記となります。
1 |
アクセス修飾子 enum enum名 {列挙子1, 列挙子2, ・・・}; |
列挙子にデータを追加し、enum名を定義することで複数のデータをまとめて管理することができます。
enum値の比較
enum型の変数はインスタンスであるにもかかわらず、「switch」文内での分岐に使うことができます。
「==」演算子での比較も可能です。
普通のインスタンスでもあるので、equals()メソッドやcompareTo()メソッドによる比較も可能になっています。
enumを使用する場合と使用しない場合のサンプルコード
イenumを使用する場合と使用しない場合のサンプルコードを見て比較してみましょう。
enumを使った場合
enumを使った場合のコードを見てみましょう。
SignalStatus.java
1 2 3 4 5 6 7 8 |
// 信号の状態を表すenum型 public enum SignalStatus { STOP, GO, CAUTION } |
Main.java
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 |
// 信号の表示を変えるクラス // enum型 public class Main { // 受け取ったパラメータに応じて信号の表示を変えるメソッド public static void print(SignalStatus type) { switch (type) { case STOP: System.out.println("赤になりました"); break; case GO: System.out.println("青になりました"); break; case CAUTION: System.out.println("黄色になりました"); break; } } public static void main(String[] args) throws Exception { //信号を青にする。 print(SignalStatus.GO); } } |
出力結果
青になりました
サンプルコードでは、enum型を宣言しています。
「STOP」「GO」「CAUTIONIの3つが定義されています。
print()メソッドでパラメータを受け取って、「switch文を使って処理を分岐しています。
SignalStatus型を使うと、必ず「SingalStatus.STOP」、「SignalStatus.GO」、「SignalStatus.CAUTION」のいずれかが渡されます。
また、「switch」文のカッコの中の変数はSignalStatus型であることがわかっているので、caseの部分に「SignalStatus.」と記述する必要がありません(記述するとコンパイルエラーになります)。
enum型もオブジェクトなので、「null が渡される場合があるので注意してください。
たとえば、 print()メソッドで「null」が渡されると、「NullPointerException」例外が発生します。
enumを使わなかった場合
enumを使わなかった場合のコードを見てみましょう。
Main.java
1 2 3 4 5 6 7 8 9 10 11 |
import java.util.*; public class Main { public static void main(String[] args) throws Exception { //信号を青にする。 Signal.print(Signal.GO); } } |
Signal.java
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 |
public class Signal { public static final int STOP = 0; public static final int GO = 1; public static final int CAUTION = 2; // 受け取ったパラメータに応じて信号の表示を変えるメソッド public static void print(int type) { switch (type) { case Signal.STOP: System.out.println("赤になりました"); break; case Signal.GO: System.out.println("青になりました"); break; case Signal.CAUTION: System.out.println("黄色になりました"); break; } } } |
出力結果
青になりました
一見するとenumを使用した場合と変わりませんが、print()メソッドのパラメータはint型なので意図のない数値を渡される可能性があり、それを防ぐためにenumが使われます。
アクセス指定子を使ったサンプルコード
アクセス指定子は、「public」のみ使用でき、省略も可能です。
そして、継承をすることはできませんが、インタフェースの実装は可能で、メソッドを実装することもできます。
先ほどのサンプルコードをアクセス指定子を使うと下記のようになります。
Main.java
1 2 3 4 5 6 7 8 9 10 11 |
// 信号の表示を変えるクラス public class Main { public static void main(String[] args) throws Exception { //信号を青にする。 SignalStatus.GO.print(); } } |
SignalStatus.java
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 |
// 信号の状態を表すenum型 public enum SignalStatus { // SignalStatus2型で定義するフィールド // カッコ内はコンストラクタに渡すバラメータ STOP("赤"), GO("青"), CAUTIONS("黄色"); // フィールドを宣言 private String status; // コンストラクター //enumのコンストラクタは必ずprivateにする必要がある private SignalStatus(String str) { this.status = str; } //状態を表示するメソッド public void print() { System.out.println(this.status + "になりました"); } } |
出力結果
青になりました
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。