EeBlog(テクニカルブログ)

第13回 列挙型(enum)使いまくり

以前、 列挙型を使用しビットフラグ を実装しました。
今回は、列挙型についてもう少し詳しく解説して見たいと思います。
Javaの列挙型はクラスやインターフェイスと同レベルで実装されています。
つまり、内部クラス(列挙型)として作らない場合は1つのファイルで作るのが普通です。
また、クラスやインターフェイスと同様に「型」として扱われます。
そこで、もう少し詳しく見ていくと、Javaの列挙型は実は 「Enum」抽象クラス の実装として生成されています。


そのため列挙型には、フィールドやメソッドを持たせることができます。
コンストラクタも定義できますし、toStringメソッド等、Objectクラスに持っている メソッドのオーバーライドや、内部クラスまで定義できてしまいます。
以下にサンプルを挙げますが、
要素の一覧の後に「;」があることに注目してください。
この「;」のあとに通常のクラスと同様にメンバを定義することができます。
また、Card(トランプ)列挙型の内部クラスとしてSuit(マーク)列挙型を 定義していることにも注目してください。
使用しているクラス(CardTest)では一覧表示に列挙型のメソッドを利用して 表示しています。
今回もコードが2つに分かれていますので注意してください。

//**************************************************
 // トランプ
//**************************************************
public enum Card {

   s01(Suit.SPADE,1),  h01(Suit.HEART,1),  d01(Suit.DIAMONDS,1),  c01(Suit.CLUB,1),
   s02(Suit.SPADE,2),  h02(Suit.HEART,2),  d02(Suit.DIAMONDS,2),  c02(Suit.CLUB,2),
   s03(Suit.SPADE,3),  h03(Suit.HEART,3),  d03(Suit.DIAMONDS,3),  c03(Suit.CLUB,3),
   s04(Suit.SPADE,4),  h04(Suit.HEART,4),  d04(Suit.DIAMONDS,4),  c04(Suit.CLUB,4),
   s05(Suit.SPADE,5),  h05(Suit.HEART,5),  d05(Suit.DIAMONDS,5),  c05(Suit.CLUB,5),
   s06(Suit.SPADE,6),  h06(Suit.HEART,6),  d06(Suit.DIAMONDS,6),  c06(Suit.CLUB,6),
   s07(Suit.SPADE,7),  h07(Suit.HEART,7),  d07(Suit.DIAMONDS,7),  c07(Suit.CLUB,7),
   s08(Suit.SPADE,8),  h08(Suit.HEART,8),  d08(Suit.DIAMONDS,8),  c08(Suit.CLUB,8),
   s09(Suit.SPADE,9),  h09(Suit.HEART,9),  d09(Suit.DIAMONDS,9),  c09(Suit.CLUB,9),
   s10(Suit.SPADE,10), h10(Suit.HEART,10), d10(Suit.DIAMONDS,10), c10(Suit.CLUB,10),
   s11(Suit.SPADE,11), h11(Suit.HEART,11), d11(Suit.DIAMONDS,11), c11(Suit.CLUB,11),
   s12(Suit.SPADE,12), h12(Suit.HEART,12), d12(Suit.DIAMONDS,12), c12(Suit.CLUB,12),
   s13(Suit.SPADE,13), h13(Suit.HEART,13), d13(Suit.DIAMONDS,13), c13(Suit.CLUB,13);

     // コンストラクタ
    private Card(Suit suit, int no) {
         this.suit = suit;
         this.no = no;
     }

     // 数値
    private int no = 0;
     public int getNo() { return no; }

     // マーク
    private Suit suit = Suit.SPADE;
     public Suit getSuit() { return suit; }

     //**************************************************
     // マーク
    //**************************************************
     public enum Suit {

         SPADE("スペード", 1),
         HEART("ハート", 2),
         DIAMONDS("ダイヤ", 3),
         CLUB("クラブ", 4);

         // コンストラクタ
        private Suit(String jpName, int rank) {
             this.jpName = jpName;
             this.rank = rank;
         }

         // 日本語名
        private String jpName = "";
         public String getJpName() { return jpName; }

         // 優先度
        private int rank = 0;
         public int getRank() { return rank; }
     }
 }

以下、トランプの一覧表示のサンプルです。

public class CardTest {
     public static void main(String[] args) {
         for (Card c: Card.values()) {
             System.out.println(c + ":" + c.getSuit().getJpName() + c.getNo());
         }
     }
 }

誰かオイラの目の前においしい料理を列挙して!!!