トップ 言語 Java アクセス修飾子、スコープ、定数 Javaのenum(列挙型)とは

Javaのenum(列挙型)とは―定数クラスや使い方、サンプル、java.lang.Enumクラスなど

定数クラスや使い方、サンプル、java.lang.Enumクラスなど。Javaのenum(列挙型)とは何かについてまとめています。

JDK 5.0から導入されたデータ型enum

Javaでは、JDK 5.0からenum(列挙型)が導入されました。

Javaの開発現場では、Constantsクラスなど定数をまとめたクラスを見かけることがあります。 CやC++などの言語では、列挙型というデータ型がありましたが、JDK 5.0以前のJavaでは、この機能はありませんでした。 限定的な定数をプログラムの中で扱いたいと思った場合、プログラマの設計に任されていました。

たとえば、アプリケーションが使用する色の種類を限定するには、int型の定数を宣言し、各定数で特定の値を表すようにします。

public static final int RED = 1;
public static final int BLUE = 2;
public static final int GREEN = 3;

このように色の値を事前に決めておくのですが、この定数はあくまでもint型の値です。 それらの値を引数にとるメソッドでは引数の型をintとして宣言することになったりします。

実行時に1、2、3以外の値や意図と異なる値が渡される可能性があり、「タイプセーフでない」状態となってしまいます。 それを回避するためには、専用のクラスなどをつくる必要がありますが、予想外のnullポインタ例外など不具合の作り込みの要因も増えます。

そのような問題を解消するため、JDK 5.0から、Javaでもenumという列挙型の機能が導入されました。

Javaのenum(列挙型)とはどんなものだろうか?

enum(列挙型)とは、特定の値のみを持つ型で、プログラマが任意に定義できる型です。 曜日のように自然に列挙される型など、定数の固定セットが必要な場合に使用するデータ型です。

enum(列挙型)の構文と定義方法

enum(列挙型)を定義するには、enumキーワードを使用して型宣言し、任意の値を列挙します。 構文は次の通りです。

<修飾子> enum 列挙型名 {<値1>,<値2>,<値3>・・・}

enum変数の定義は、次の2つからなります。

  1. 名前つきの値のセットを持つenum型を定義します。
  2. 変数を定義して、これらの値のうちの1つを保持します。

なお、enumはクラスとは異なり、enumのコンストラクタを直接呼び出すことは出来ません。 適切な引数によって背後で自動的に呼び出されます。 また、メソッド内では宣言できないので注意が必要です。

enum(列挙型)のサンプルプログラム

以下のサンプルでenum型を試してみます。まずは、enum型のColorsを定義します。

サンプルコード1―色を表すenum(列挙型)

色を表すenum(列挙型)の例です。ファイル名はColors.javaです。

public enum Colors {
    RED,
    BLUE,
    GREEN
}

サンプルコード2―enum(列挙型)を使用するクラス

次に、上記のColorsを使用するmainメソッドのあるクラスを定義します。 ファイル名は、EnumTest.javaです。

public class EnumTest
{
    public static void main(String[] args) {
        System.out.println(Colors.RED);
        System.out.println(Colors.BLUE);
        System.out.println(Colors.GREEN);
    }
}

コンパイル

cd <ソースファイルのあるディレクトリのパス>
javac *.java

実行

java EnumTest
RED
BLUE
GREEN

Enumクラス

実は、すべてのenum(列挙型)はjava.lang.Enumクラスのサブクラスです。 enum(列挙型)は、java.lang.Enumクラスを継承したfinalクラスで、列挙した値は、public static final指定されたクラス変数の名前となります。 言ってしまえば、クラス定数と同じということになります。

つまり、中身は確認していませんが、以下のようなコードイメージになります。 ※説明が分かりやすくするためのイメージですので注意!です。

final class Colors extends java.lang.Enum<Colors>
    public static final Colors RED;
    public static final Colors BLUE;
    public static final Colors GREEN;
    public static Colors[] values() {・・・}
    public static Colors valueOf(java.lang.String) {・・・}
    static {・・・}

Colorsクラスの場合、RED、BLUE、GREENというpublic static finalの変数に、それぞれColorsオブジェクトが代入されます。 「列挙型名.クラス定数名(列挙した値)」と記述して利用できるようになります。

Enumクラスのサブクラスなので、Enumクラスのメソッドを継承しています。 また、values()とvalueOf()というstaticメソッドが自動で追加されます。

つまり、列挙型の実態は定数やメソッドを持つクラスです。 ただし、明示的にnew演算子でコンストラクタを呼び出して、インスタンス化できないようになっています。 列挙した値を名前とするクラス定数に、列挙型をインスタンス化したオブジェクトが格納されるだけのクラスとなります。

もっと知識を広げるための参考

戻る

スポンサーリンク

サイト内のページ

言語
C・C++ /HTML /Java /JavaScript /PHP /シェルスクリプト

開発環境
Ant /Bcc /Eclipse /gcc /gdb /g++ /JDK /JUnit /ZAP

技術・仕様
Ajax /CORBA /Java EE(旧称J2EE) /JNI

ライブラリ/Framework/CMS
jQuery /Lucene /MyBatis /RESTEasy /Spring /Struts /Seasar2 /WordPress

ITインフラ OSとミドルウェア
Linux /Windows /シェル
Apache/Tomcat /MySQL /Redis /Solr /vsftpd

ITインフラ PC 製品
ZOTAC

ITインフラ サーバー
Web公開サーバー構築

ITインフラ ネットワーク
プログラミング /機器 /構築

ITインフラ セキュリティ
公開サーバーのセキュリティ

SI
ホームページの作り方 /小さな会社のISMS

その他
IT用語 /ITスキル体系 /トレンド履歴 /翻訳英語の学習 /RSEUserGuide翻訳

スポンサーリンク