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

EnumMapを使ってみる

こんにちは。「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クラスのインスタンスを定義します。クラスの直下に記述する想定です。

    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仕様書のどこに記載されているか、確認できませんでした。

結果は上記の通りとなります。Marの略記がMarで同じでピリオド無しなのは、省略の形ではないからだそうです。もともと3文字なので仕方ありません。