【Java】列挙型(Enum)について

Java

Javaには列挙型というものがあります。

皆さんはこの列挙型を使ったことはありますでしょうか?

Javaを勉強し始めたばかりですと使う機会はめったにないと思います。

今回はJava Goldを勉強している中で出てきたため備忘録もかねてどういったものかを残しておこうと思います。

列挙型とは?

列挙型の使用方法

まず列挙型とはどういったものかと言いますと、定数をまとめて定義しておくことが可能な型の事です。

下記のようにenumという型を使用しカッコ内に列挙子と呼ばれる定数を記載することで定義できます。

public enum Country{Japan,America,China,France};

使用方法としては下記のようにswitch文等で使用します。

【使用例】
public class Main{
	public static void main(String[] args){
		Country my_country=Country.Japan;
		switch(my_country){
			case Japan:
				System.out.println("私の出身地は日本です。");
				break;
			case America:
				System.out.println("私の出身地はアメリカです。");
				break;
			case China:
				System.out.println("私の出身地は中国です。");
				break;
			case France:
				System.out.println("私の出身地はフランスです。");
				break;
		}
	}
}
【実行結果】
私の出身地は日本です。

列挙型を使用するメリット

そんなの普通に定数定義すればいいのでは?という疑問がある方もいると思いますので、どういった点で優れているのかについても解説しておきます。

列挙型が出てくる前は確かに定数を定義したりして実施していたようです。

ただ定数を定義するだけですと、ぱっと見どういった機能を備えているのかわからないといったことや、同じ定数値で宣言してしまうといった不具合のもとになりそうなことが起こります。

例えば下記のようなプログラムがあったとします。

よく見ると定数値0の定数がJapanとCanadaの2つ存在しています。

public class Country {
	public static void main(String[] args) {
		final int Japan=0;
		final int America=1;
		final int China=2;
		final int France=3;
		final int Canada=0;
		int my_country=0;
		switch(my_country){
			case 0:
				System.out.println("私の出身地は日本です。");
				break;
			case 1:
				System.out.println("私の出身地はアメリカです。");
				break;
			case 2:
				System.out.println("私の出身地は中国です。");
				break;
			case 3:
				System.out.println("私の出身地はフランスです。");
				break;
		}

	}

}

数個の定数値を決めておくだけなら間違うことはほぼないかもしれませんが、大規模開発となってくると数百個の定数を扱うということも出てくるかもしれません。

そのような時にちょっとしたミスで同じ定数値を設定してしまうということもあるかもしれません。

そのようなことになったらプログラムのバグの原因となってしまいます。

このようなミスを減らしてくれるのが、列挙型となります。

列挙型のメソッドについて

列挙型にはメソッドが定義されています。

それがvaluesメソッドとvalueOfメソッドです。

まずvaluesメソッドですが、これはenumに定義されている列挙子をすべて取得する際に使用します。

例えば先ほど定義したCountryというenumの列挙子をすべて取得する場合下記のように記載します。

【使用例】
public class Main{
	public static void main(String[] args){
		for(Country country:Country.values()){
			System.out.println(country);
}
【実行結果】
Japan
America
China
France

このようにすべての列挙子を取得することができました。

次にvalueOfですが、これは引数に指定した文字列と同様の列挙子を取得するのに使用されます。

【使用例】
public class Main{
	public static void main(String[] args){
		if(Country.China==Country.valueOf("China")) {
			System.out.println("あなたの出身地は中国ですか?");
		}
	}
}
【実行結果】
あなたの出身地は中国ですか?

上記のようにif文で同様の列挙子であることが判断されていることが分かります。

インスタンス化時の動作について

列挙型は少し特殊で使用される際に列挙子一つ一つがインスタンス化されます。

どういうことかというと先ほど紹介したコードで基に解説しますと、下記のように列挙子には()を使用して値を渡すことが可能となります。

【コード】
public enum Countries {
	Japan("日本"),America("アメリカ"),China("中国"),France("フランス");
	Countries(String value){
		System.out.println("私の出身地は"+value+"です。");
	}
}
public class Main {
	public static void main(String[] args) {
		System.out.println(Countries.France);
	}
}
【実行結果】
私の出身地は日本です。
私の出身地はアメリカです。
私の出身地は中国です。
私の出身地はフランスです。
France

このコードを実行すると上記のようにすべての列挙子の値を出力した後に列挙子Franceが出力されます。

Countries.Franceで初めて列挙子が呼び出されるタイミングでJapan(“日本”)、America(“アメリカ”)、China(“中国”)、France(“フランス”)とコンストラクタが4度呼び出されることになります。

列挙子の値を一つだけ呼び出そうとして関係ない列挙子まで呼び出してしまわないように気を付けましょう。

まとめ

この記事ではJavaの列挙型について解説してきました。

  • 列挙型とは?
  • インスタンス化時の動作について

列挙型は始めのころは中々使う機会が出てこない機能かもしれませんが、覚えておいて損のない機能なのではないでしょうか?

実際Javaではありませんが、私も仕事でC++を触っていてそこら中に列挙子が出てきます。

開発現場では重宝される機能なのかもしれませんね。

以上で今回の解説は終了となります。

コメント

タイトルとURLをコピーしました