【Java】 【enum】 ordinalは使わないほうがいいですよ

こんにちは、たくじろう(@takujiro_0529)です。

今回は、Javaのenumを利用する機会があったのですが、調べてみたところordinalメソッドは利用しないほうがいいとのことでしたので、その理由と回避策を紹介します。

スポンサーリンク




ordinalとは

まず、ordinalメソッドの挙動を確認します。

public enum Num {
ONE,
TWO;
}

こちらをodinalメソッドで呼び出すと

System.out.println(Num.ONE.ordinal());
System.out.println(Num.TWO.ordinal());
結果
0
1

となります。

ordinalを推奨しない理由

ordinalメソッドの利用方法を確認してもらったとおり、これは上から順番に番号を0から振っています。

それを基準にマスタのデータベースの値に「0」「1」と持たせて、エンティティとして扱うときにenumクラスに変換して利用していたとします。

しかし、Numクラスの「ONE」と「TWO」の間に別の値を入れる修正が入ったとします。

public enum Num {
ONE,
one,
TWO;
}

この修正が入った場合に何が起きるかといいますと、ordinalの値が変わってしまいます。
するとマスタの値がずれてしまい、データが壊れてしまいます。

このようなことから、ordinalは定数として扱おうとすると、重大なバグのもとになってしまう可能性があるのです。

ordinalを使わない解決策

一般的ではありますが、メジャーな解決策を紹介します。

public enum Num {
    ONE(1),
    TWO(2);
    
    private int number;

    private Num(int number){
        this.number = number;
    }

    public int getNumber() {
        return this.number;
    }
}

この解決方法は、コンストラクタを書き出し新しい引数を追加して、そこにordinalの代わりとして、数値(変数:number)を用意して「getNumber」メソッドを利用して定数を取得できるようにしています。

この場合に新たに要素を追加しようとしたときに、( )内の引数を変えなければ、いくら順番を変えようとも値が変更されることはありません。

まとめ

Javaでenumを利用する機会があったりなかったりだとは思いますが、ordinalを利用してコードを書いてしまわないように気をつけましょう。

また利用するにしても、enumクラスに要素の追加をするときには気をつけましょう。

こう考えると、利用しない方がメンテナスが楽そうですね。

byたくじろう(@takujiro_0529)

スポンサーリンク

スポンサーリンク



シェアする

  • このエントリーをはてなブックマークに追加

フォローする