Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのEnum(列挙型)をマスターする:基本構文から実践例まで徹底解説

Javaのenum(列挙型)は、定数のリストを格納するためのデータ型です。enumキーワードを使って列挙型を作成でき、定数は波括弧 {} の中にカンマ区切りで記述します。

enumは「enumeration(列挙)」の略で、取りうる値があらかじめ固定されているデータ型のことです。変数が特定の値のリストの中から1つだけを持つべき場合に特に役立ちます。たとえば、コーヒーショップで販売しているドリンクのサイズ(SMALL、REGULAR、LARGEなど)を管理したい場合に最適です。

この記事では、Javaにおけるenumの基礎から実践的な使い方まで、サンプルコードとともにわかりやすく解説します。

Java Enumの基本構文

Javaのenumは定数のリストを表します。enumから代入された変数には、そのenum内に定義された値しか設定できません。変更されることがないデータを安全に扱いたい場合に、enumは開発者にとって強力なツールとなります。

たとえば、「従業員の給与等級を表す変数には5つの値のいずれかしか入らない」「従業員の契約形態を表す変数にはパートタイム、フルタイム、ゼロ時間契約の3つしか入らない」といったケースでは、enumを使うのが適切です。

enumは「enum」キーワードを使って宣言します。基本的な構文は以下の通りです。

enum 名前 {
  値1, 値2, 値3
}

構文の各要素を分解して見てみましょう。

  • enum:列挙型を宣言することをプログラムに伝えます。
  • 名前:enumの名前です。
  • 値1, 値2, 値3:enumが保持する定数のセットです。慣習として大文字で記述します。

なぜJavaでEnumを使うのか?

enumを使うことで、アルゴリズムを自分自身にもコンピュータにも、より読みやすい形で表現できます。

enumを定義すると、「この変数には特定の値しか入らない」ことをコンパイラとコードを読む人間の両方に明示できます。enumを使用している変数を見れば、その変数が限られた値のいずれかしか取らないことがひと目でわかるため、コードの理解が容易になります。

さらに、enumは定数をより効果的に活用する手段でもあります。実際、enumはJavaに導入された際、複数行にわたり可読性の低かったint定数を置き換えるために作られました。以下は、従来のint定数を使った例です。

class IntConstant {
  public final static int ECONOMY = 1;
  public final static int BUSINESS = 2;
  public final static int FIRST_CLASS = 3;
}

同じ内容をenumで書くと、次のようにすっきりとまとまります。

class AirplaneClasses {
  ECONOMY, BUSINESS, FIRST_CLASS
}

こちらの方がシンプルで読みやすいコードになっていますね。

Java Enumの宣言方法

ここでは、カフェの店員がバリスタにコーヒーの注文を送信できるアプリを開発する場面を想定してみましょう。

バリスタがドリンクのサイズを入力する際、選択肢はSMALL、REGULAR、LARGEの3つだけに制限したいとします。そんなとき、enumを使えばドリンクサイズをこれらの選択肢だけに限定できます。

enum Sizes {
  SMALL, REGULAR, LARGE
}

この例では、3つの値を持つSizesというenumを宣言しました。enumを宣言すれば、コード内でその値を参照できるようになります。

Java Enumの実践例

次に、顧客が注文したコーヒーのサイズをコンソールに出力するプログラムを書いてみましょう。出力された値は、ドリンクを準備するバリスタが確認することになります。

以下のコードで、注文されたコーヒーのサイズをコンソールに出力できます。

enum Sizes {
  SMALL, REGULAR, LARGE
}
class PrintSize {
  Sizes coffeeSize;

  public PrintSize(Sizes coffeeSize) {
    this.coffeeSize = coffeeSize;
  }

  public void placeOrder() {
    switch(coffeeSize) {
      case SMALL:
        System.out.println("This coffee should be small.");
        break;
      case REGULAR:
        System.out.println("This coffee should be regular.");
        break;
      case LARGE:
        System.out.println("This coffee should be large.");
        break;
    }
  }
}
class Main {
  public static void main(String[] args) {
    PrintSize order173 = new PrintSize(Sizes.SMALL);
    order173.placeOrder();
  }
}

実行結果:

This coffee should be small.

まず、SMALL、REGULAR、LARGEの3つの値を持つSizesというenumを宣言しています。次に、PrintSizeクラスを定義しました。このクラスは顧客のドリンクサイズを受け取り、そのサイズをコンソールに出力します。

メインプログラムでは、PrintSizeクラスを使ってorder173というオブジェクトを生成し、引数としてSizes.SMALLを渡しています。これにより、PrintSizeクラス内のcoffeeSize変数にSMALLが代入されます。

続いて、order173.placeOrder()を呼び出すことで、PrintSizeクラス内のswitch文が実行されます。switch文はcoffeeSize変数の値を3つのケースと照合し、注文されたコーヒーのサイズに応じたメッセージをコンソールに出力します。

今回は顧客がスモールサイズのコーヒーを注文したため、「This coffee should be small.」というメッセージが出力されました。

Javaのswitch文についてさらに詳しく知りたい方は、Java switchステートメントに関する解説記事も参考にしてください。

Java Enumの主なメソッド

Javaのenumクラスには、enumの値を取得・操作するための便利なメソッドが多数用意されています。ここでは、特によく使われる5つのメソッドを紹介します。

compareTo()

compareTo()は、enumの定数同士を辞書順に比較し、序数(ordinal)の差を返します。先ほどの例のenum値に対してcompareTo()を使ってみましょう。

int difference = Sizes.SMALL.compareTo(Sizes.LARGE);
System.out.println(difference);

このコードは、SMALLとLARGEの序数の差を返します。実行結果:

-2

toString()

toString()は、enumの名前を文字列に変換します。LARGEというenum値を文字列に変換する例を見てみましょう。

String large_string = Sizes.LARGE.toString();
System.out.println(large_string);

実行結果:

LARGE

name()

name()メソッドは、enumクラスで定義された定数の名前を返します。REGULARというコーヒーサイズの定義名を取得する例です。

String regular_name = Sizes.REGULAR.name();
System.out.println(regular_name);

実行結果:

REGULAR

values()

values()メソッドは、enumに含まれるすべての定数を格納したJava配列を返します。使用例は以下の通りです。

Sizes[] sizeList = Sizes.values();

valueOf()

valueOf()は文字列を受け取り、同じ名前を持つenum定数を返します。たとえば、REGULARという名前のenum定数を取得したい場合は、次のように書きます。

Sizes regular_constant = Sizes.valueOf("REGULAR");
System.out.println(regular_constant);

実行結果:

REGULAR

まとめ

enum(enumeration=列挙)とは、取りうる値が固定されたJavaのデータ型です。特定の範囲の値から1つだけを格納すべき変数を扱う場合に、enumは非常に有効です。

この記事で学んだ内容を実際に手を動かして練習すれば、Javaでのenumの使い方をしっかりと身につけられるでしょう。Javaプログラミングについてさらに学びたい方は、Javaのコーディング方法を網羅した完全ガイドもぜひチェックしてみてください。

  1. OpenCV Javaライブラリで画像に幾何学的図形を描画する方法

    Java版OpenCVライブラリの org.opencv.imgproc パッケージには、Imgproc クラスが含まれています。このクラスは、resize()、warpAffine()、filter2D() など、入力画像を処理するためのさまざまなメソッドを提供しています。さらに、Imgprocクラスには画像上に幾何学的図形を描画するためのメソッド群も用意されています。主なものは以下のとおりです。図形メソッドと説明楕円(Ellipse)ellipse() メソッドを使用すると、画像に楕円を描画できます。円(Circle)circle() メソッドを使用すると、画像に円を描画できます。長方形(

  2. JavaFXのパス要素とは?種類と使い方をわかりやすく解説

    javafx.scene.shape パッケージには、2D図形を描画するためのさまざまなクラスが用意されています。しかし、これらは直線、円、多角形、楕円といった基本的な(プリミティブな)図形に限られます。より複雑なカスタム図形を描きたい場合は、Pathクラスを使用する必要があります。 Pathクラスとは Pathクラスは、図形の幾何学的な輪郭を表すクラスです。このクラスを使うことで、独自のカスタムパスを自由に描画できます。 カスタムパスを描くために、JavaFXでは複数の「パス要素」が提供されており、これらはすべて javafx.scene.shape パッケージ内のクラスとして利用可能です。