java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

列挙型を使う

投稿日:

最終更新日:2016年08月26日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。

今回は列挙型の使い方を復習しました。

列挙型というデータ型があります。これは定数をまとめて扱うクラスです。enum 識別子 { 定数,… }という書き方で使います。

日本の硬貨を定数にする

例えば、日本の硬貨を扱う列挙型を考えてみましょう。例えば、以下のように宣言します。

列挙型

    enum Coin { ONE, FIVE, TEN, FIFITY, HUNDRED, FIVE_HUNDRED }

上記ではCoinという識別子で1円玉から500円玉を表す定数を定義しました。定数は大文字で記述するのが一般的な習慣のようです。上記列挙型を定義すると、Coin.[定数]という書き方が使えます。

定数とは別にCoin.[メソッド]という書き方でメソッドが使えます。そのうちのvalues()だけ紹介します。このメソッドは列挙型に定義されている定数全てからなる配列を返却するようです。以下のように拡張for文に使えます。System.out.printlnの引数に列挙型の定数を指定すると定数そのものの文字列が出力されます。

列挙型を拡張for文で使う例

        for (Coin c : Coin.values()) {
            System.out.println(c);
        }

以下、実行結果です。

結果

ONE
FIVE
TEN
FIFITY
HUNDRED
FIVE_HUNDRED

ordinal()メソッドで列挙宣言での位置を取得することができます。以下はordinal()メソッドの例と結果です。

ordinal()メソッド

        System.out.println(Coin.ONE.ordinal());
        System.out.println(Coin.FIVE.ordinal());
        System.out.println(Coin.FIVE_HUNDRED.ordinal());

結果

0
1
5

定義順に0から順番に数えるようです。

定数と値を対応

さて、このままでは定義だけで実際にの金額の値への対応がわかりません。名前から推測は出来ますが、実際にint型に直したいときは次のようにコンストラクタを使ってフィールドへ値を代入します。

コンストラクタの定義がある列挙型

    enum Coin {

            ONE(1), FIVE(5), TEN(10), FIFITY(50), HUNDRED(100), FIVE_HUNDRED(500);

            private int price;

            Coin(int price) {
                this.price = price;
            }

            public int getPrice() {
                return price;
            }

        }

フィールドpriceに対応するgetterを定義することで、定数.getPrice()という書き方ができます。列挙型は内部的には特殊なクラスらしく、定数それぞれがフィールドを持っているということです。上記定義で金額との対応がつきました。例えば、以下のように金額を出力することができます。

金額の出力

        for (Coin c : Coin.values()) {
            System.out.printf("%12s: %3d", c, c.getPrice());
            System.out.println();
        }

結果

         ONE:   1
        FIVE:   5
         TEN:  10
      FIFITY:  50
     HUNDRED: 100
FIVE_HUNDRED: 500

定数に対応する金額が出力できています。しかし、名前が定数名そのものなのは使い勝手が悪そうなので、フィールドにString nameを追加し、getName()メソッドを追加してみました。

nameを追加したソース

    enum Coin {

        ONE("1円玉", 1),
        FIVE("5円玉", 5),
        TEN("10円玉", 10),
        FIFITY("50円玉", 50),
        HUNDRED("100円玉", 100),
        FIVE_HUNDRED("500円玉", 500);

        private String name;
        private int price;

        Coin(String name, int price) {
            this.name = name;
            this.price = price;
        }

        public String getName() {
            return name;
        }

        public int getPrice() {
            return price;
        }

    }

これで以下のようにgetNameメソッドを呼び出せます。

名前と金額の出力

        for (Coin c : Coin.values()) {
            System.out.printf("%5s: %3d", c.getName(), c.getPrice());
            System.out.println();
        }

結果

  1円玉:   1
  5円玉:   5
 10円玉:  10
 50円玉:  50
100円玉: 100
500円玉: 500

名前も出力できました。