こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

列挙型を使う

こんにちは。「Javaを復習する初心者」です。今回は列挙型の使い方を復習しました。

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

日本の硬貨を定数にする

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

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

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

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

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

以下、実行結果です。

ONE
FIVE
TEN
FIFITY
HUNDRED
FIVE_HUNDRED

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()メソッドを追加してみました。

    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

名前も出力できました。