java-beginner.com ブログ

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

EnumMapを使ってみる

投稿日:

最終更新日:2016年09月13日

アイキャッチ

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

今回はEnumMapというクラスを使ってみました。

EnumMapはMapインターフェースの実装クラスで、列挙型の定数をキーに使うことができます。今回はこのクラスを使って、月の列挙型と月の略記を対応付けてみました。

対応の表

以下を対応させます。

略記
January Jan.
February Feb.
March Mar.
April Apr.
May May
June Jun.
July Jul.
August Aug.
September Sep.
October Oct.
November Nov.
December Dec.

列挙型

最初に月を表す列挙型を用意します。

月の列挙型

    public static enum Month {
        January,
        February,
        March,
        April,
        May,
        June,
        July,
        August,
        September,
        October,
        November,
        December
    }

列挙型はenum [識別子] { 定数… }という形式で定義します。上記の定義で、Month.[月]という記述ができます。

EnumMap

次に列挙型の定数をキーとするEnumMapクラスのインスタンスを定義します。クラスの直下に記述する想定です。

EnumMap

    public final static EnumMap<Month, String> monthAbbrMap = new EnumMap<>(Month.class);

    static {
        monthAbbrMap.put(Month.January, "Jan.");
        monthAbbrMap.put(Month.February, "Feb.");
        monthAbbrMap.put(Month.March, "Mar.");
        monthAbbrMap.put(Month.April, "Apr.");
        monthAbbrMap.put(Month.May, "May");
        monthAbbrMap.put(Month.June, "Jun.");
        monthAbbrMap.put(Month.July, "Jul.");
        monthAbbrMap.put(Month.August, "Aug.");
        monthAbbrMap.put(Month.September, "Sep.");
        monthAbbrMap.put(Month.October, "Oct.");
        monthAbbrMap.put(Month.November, "Nov.");
        monthAbbrMap.put(Month.December, "Dec.");
    }

EnumMapのコンストラクタはEnumMap(Class<K> keyType)を使いました。指定されたキーの型から空のenumマップが作られるようです。ジェネリックスでキーの型を指定しているのですが、それとは別途必要なようです。

「static{…}」の部分はstatic初期化子です。クラスがロードされたときに一度だけ実行されます。ここで列挙型の各定数と略記文字列を登録しています。putメソッドで登録ができます。このあたりは、Mapインターフェースの実装クラスなので使い方はHashMapと似ています。

以下は列挙型それぞれに対して、EnumMapの値を取得する例です。列挙型のvaluesメソッドで拡張for文を使っています。

ソース

        for (Month m : Month.values()) {
            System.out.println(String.format("%sの略は%s", m, monthAbbrMap.get(m)));
        }

結果

Januaryの略はJan.
Februaryの略はFeb.
Marchの略はMar.
Aprilの略はApr.
Mayの略はMay
Juneの略はJun.
Julyの略はJul.
Augustの略はAug.
Septemberの略はSep.
Octoberの略はOct.
Novemberの略はNov.
Decemberの略はDec.

valuesメソッドを列挙型の値を定義順に取得できるようなのですが、API仕様書のどこに記載されているか、確認できませんでした。

結果は上記の通りです。「May」の略記が「May」と出力される(ピリオドの付与がない)のは、省略の形ではないからだそうです。もともと3文字なので仕方がありません。

謝辞:文中の「Mar」と「May」の間違いをご連絡してくださってくれた方、ありがとうございました。