Javaのenumとは?基本から便利な使い方まで解説

- システム
エンジニア - Javaのenumとは、どのようなものなのでしょうか?
- プロジェクト
マネージャー - Javaの定数を一覧のように列挙することでenumと定義されます。
enumとは?
enumとは列挙型と呼ばれるJavaの機能の一つです。プログラム実行中に変更されることのない値を定数と表現できますが、Javaでは定数を一覧のように列挙することでenumとして定義することができます。言葉で説明するだけではわかりにくいと思うので、サンプルプログラムを用意しました。
1
2
3
4
5
6
|
public class SampleProgram {
public enum TeamMember { YAMADA, TANAKA, SATOU, }
public static void main(String[] args) {
System.out.println(TeamMember.YAMADA);
}
}
|
チームメンバーをイメージしたenumです。3名のメンバーが列挙されています。このプログラムを実行すると標準出力に「YAMADA」と出力されます。Javaのenumは、このようにカンマ区切りで制限なく定数を列挙して宣言することができ、スコープの範囲内であれば自由に呼び出すことができます。
switch文でも型の恩恵を得られる
Javaのenumは以下のサンプルプログラムのようにswitch文に使用することもできます。このプログラムは、実行すると標準出力に「山田」と出力されます。スッキリ書けることはもちろん、Stringとは異なり予めenumとして定義した値のみcaseに書くことができるので、タイプミスなどのヒューマンエラーを防げることが強みです。
1
2
3
4
5
6
7
8
9
10
11
12
|
public static void main(String[] args) {
TeamMember member = TeamMember.YAMADA;
switch (member) {
case YAMADA: System.out.println("山田");
break;
case TANAKA: System.out.println("田中");
break;
case SATOU: System.out.println("佐藤");
break;
default: break;
}
}
|
各標準メソッドの使い方をチェック
Javaのenumの基底クラスはEnumという抽象クラスです。このクラスには一般的なenumでよく使われるメソッドが標準で用意されています。これらのメソッドは、一見地味ながらも使いどころの多い便利なものです。使い方をチェックしていきましょう。
nameメソッド
nameメソッドはenumの名前をStringで返すメソッドです。下記のサンプルコードなら「YAMADA」と出力されます。このメソッドはあくまでenumの名前を返すメソッドなので、プログラマフレンドリな文字列を返すメソッドとしてはOverrideすることが可能なtoStringを使用しましょう。
1
|
System.out.println(TeamMember.YAMADA.name());
|
ordinalメソッド
ordinalメソッドはそのenumの列挙宣言での位置をintで返します。最初に列挙されたenumの位置は0であることに注意が必要です。宣言の順番に意味があるときに使用できますが、多くの場合、後述するフィールドの設定を用いた方が信頼性の高いコードを書くことができます。このメソッドはEnumSetやEnumMapなどのenumベースのデータ構造を用いるときに使用すると良いでしょう。
1
2
3
|
System.out.println(TeamMember.YAMADA.ordinal()); // 0 と出力される
System.out.println(TeamMember.TANAKA.ordinal()); // 1 と出力される
System.out.println(TeamMember.SATOU.ordinal()); // 2 と出力される
|
compareToメソッド
compareToメソッドは引数に指定されたオブジェクトと比較を行うメソッドです。enumが指定されたオブジェクトよりも小さい場合は負の整数、同じ場合は0、大きい場合は正の整数を返します。この時の大小の比較はenumの宣言の順番をもとに行われます。
1
2
3
4
5
|
if (TeamMember.YAMADA.compareTo(TeamMember.TANAKA) < 0) {
System.out.println("山田さんは田中さんよりも先に宣言されている"); // こちらの行が実行される
} else {
System.out.println("山田さんは田中さんよりも後に宣言されている");
}
|
valueOfメソッド
valueOfメソッドは引数に指定された名前のenumを返すメソッドです。この後説明するvaluesメソッドと合わせて使用することでenumの名前とenumのマッピングを行うことができます。
1
|
System.out.println(TeamMember.valueOf("YAMADA")); // YAMADA と出力されるSystem.out.println(TeamMember.valueOf("TANAKA")); // TANAKA と出力されるSystem.out.println(TeamMember.valueOf("SATOU")); // SATOU と出力される
|
valuesメソッド
valuesメソッドは、enumのすべての定数を宣言順に並べた配列を返します。以下のようにenumを宣言した順にループさせることができ、valueOfメソッドの説明で触れたようにenumの名前とenumのマッピングを行うときによく使用されます。
1
2
3
|
for (TeamMember member : TeamMember.values()) {
System.out.println(member.name()); // YAMADA, TANAKA, SATOU と順に出力される
}
|
enumもクラス!メンバをフル活用してもっと便利に
一見するとenumはクラスとは別のものに見えるかもしれませんが、先ほども少し触れたとおり、JavaのenumはすべてEnumという抽象クラスを継承したものなのです。つまり、enumもJavaのクラスの1つです。一般的なクラスと同じように、メンバを定義することができます。サンプルプログラムとともに詳しく見ていきましょう。
フィールドやメソッドを定義してみよう
下記のサンプルプログラムでは、今まで扱ってきたTeamMemberにnameというフィールドを定義しています。このようにprivateなコンストラクタを用いてフィールドに値を設定できます。また、一般的なクラスと同じ記法でメソッドを定義することもでき、サンプルプログラムではgetNameメソッドを定義しています。このように、enumにメンバを定義することで、より便利にenumを使うことができます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class SampleProgram {
public enum TeamMember { YAMADA("山田"), TANAKA("田中"), SATOU("佐藤"),;
private final String name;
private TeamMember(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
public static void main(String[] args) {
for (TeamMember member : TeamMember.values()) {
System.out.println(member.getName()); // 山田, 田中, 佐藤 と順に表示される
}
}
}
|
- システム
エンジニア - enumもJavaのクラスのひとつなのですね。
- プロジェクト
マネージャー - そうですね。基本的な使い方から徐々にマスターしていきましょう!
enumを積極的に使ってみよう
enumの使い方について理解できたでしょうか。まずは数十以内の定数群をenumとして定義して、標準メソッドだけでも積極的に使ってみましょう。コードの品質が上がることを実感できるはずです。慣れてきて自然にenumのフィールドやメソッドを活用できるようになったなら、enumの使い方はしっかりおさえられたと言えます。ぜひ、チャレンジしてみてください。
FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Java新着案件New Job
-
官公庁向け業務システム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給39万~44万円東京都千代田区(永田町駅) -
販売管理システム開発/Java/東京都中央区/【WEB面談可】/テレワーク
月給49万~55万円東京都中央区(京橋駅) -
生命保険会社向けシステム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給42万~48万円東京都千代田区(大手町駅) -
社会保険システムのパッケージ開発/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(新橋駅) -
金融機関向けシステム更改/Java/東京都江東区/【WEB面談可】/テレワーク
月給46万~51万円東京都江東区(豊洲駅) -
大手通信会社者向けWebシステム改修/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(品川駅)