技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

java:Enumによりコード値に意味を持たせ可読性を向上させる

javaEnum(列挙型)を使用するメリットとしては、一般的に「使用可能な定数を明確化できる」「定数を複数のクラスで使い回せる」といったメリットが挙げられます。
実際に使用していて、コード値に意味を持たせられるというメリットもありそうだったので、記事に残します。
 
コーディングをしていると、コード値を用いた方が便利な場合が間々あります。
例えば、RPGの道具に対して、「weakSwordにはID0、normalSwordにはID1、strongSwordにはID2を割り振る」といった具合です。
コード値を用いれば、コード値を用いて配列操作することが可能になりますし、DBでマスタ管理する際にも便利です。
 
しかし、コード値には「人間が理解し辛い」というデメリットがあります。
コンピュータで処理する分には効率が良いのですが、人間から見たら「IDが0ならweakSword、IDが1なら…」といった具合で、コード値が何を意味しているのかを予め知る必要が出てきてしまいます。
コード値とその意味の対応付けを人間が行うことで、読み間違い・書き間違いといったバグに繋がるミスも起こりやすくなります。
 
そこで、Enumでコード値とその意味の対応付けを行えば、「ソースコード上は意味のある単語、コンピュータ上はコード値」という形にできます。
そうすることで、コード値とその意味の対応付けを人間が行う必要が無くなり、読み間違い・書き間違いを未然に防ぐことができます。
 
以下、サンプルコードです。
 
【サンプルコード】
・ItemEnum.java
public enum ItemEnum {
    weakSword(0),
    normalSword(1),
    strongSword(2);

    private int id;
    public final static int ITEM_TOTAL_NUMBER = 3; // 道具の総数

    private ItemEnum (int id) {
      this.id = id;
    }

    public int getId() {
        return id;
    }

    public static ItemEnum valueOf(int id) {
        ItemEnum[ ] array = values();
        for(ItemEnum num : array) {
            if (id == num.getId()){
                return num;
            }
        }
        return null;
    }

    public static int getItemPrice(ItemEnum itemEnum) {

        int[] result = new int[ITEM_TOTAL_NUMBER];

        result[weakSword.getId()] = 100;
        result[normalSword.getId()] = 200;
        result[strongSword.getId()] = 300;

        return result[itemEnum.getId()];

    }

}
 
・ItemManagementMain.java
public class ItemManagementMain {

    public static void main(String[ ] args) {

        // 道具袋を定義し、道具を入れていく
        // javaの言語仕様でint型は初期値0のため初期化は不要
        int[ ] itemBag = new int[ItemEnum.ITEM_TOTAL_NUMBER];
        itemBag[ItemEnum.weakSword.getId()]++;
        itemBag[ItemEnum.normalSword.getId()]++;
        itemBag[ItemEnum.strongSword.getId()]++;
        itemBag[ItemEnum.weakSword.getId()]++;
        itemBag[ItemEnum.strongSword.getId()]++;

        // 道具袋の中の数を確認
        System.out.println("・道具袋の中身の確認");
        for(int i = 0; i < ItemEnum.ITEM_TOTAL_NUMBER; i++) {
            System.out.println
                (" " + ItemEnum.valueOf(i) + " は " + itemBag[i] + " 個 ");
        }

        // 道具の値段を確認
        System.out.println();
        System.out.println("・道具の値段の確認");
        for(int i = 0; i < ItemEnum.ITEM_TOTAL_NUMBER; i++) {
            System.out.println
                (" " + ItemEnum.valueOf(i) + " の値段は " +
                    ItemEnum.getItemPrice(ItemEnum.valueOf(i)));
        }

    }

}
 
【実行結果】
・道具袋の中身の確認
 weakSword は 2 個
 normalSword は 1 個
 strongSword は 2 個

・道具の値段の確認
 weakSword の値段は 100
 normalSword の値段は 200
 strongSword の値段は 300