こんにちは。「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」の間違いをご連絡してくださってくれた方、ありがとうございました。