Javaで定数を定義する方法として、「定数クラスを作成する」、「インターフェースを使用する」、「列挙型を使用する」、「プロパティファイルを使用する」など様々な手法がありますが、個人的には可読性/保守性を考えた場合「列挙型を使用する」が一番良いと信じているのでここでは列挙型(enum)の使用方法をご紹介します。
列挙型(enum)のメリット
- 可読性、保守性が容易となる。
列挙型(enum)のデメリット
- 定数クラスに比べるとコードが多少長くなる。
Javaソース:enumクラスの例
-
- 以下はenumクラスの一番基本的なソースコード例です。プライベートコンストラクタを定義する事によって無駄なインスタンス化を抑制しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
/** * <p>[概 要] 番号の列挙型クラス</p> * <p>[詳 細] </p> * <p>[備 考] </p> */ public enum EnumNumber { NUMBER_1(Integer.valueOf(1)), NUMBER_2(Integer.valueOf(2)); private Integer num; /** * <p>[概 要] プライベートコンストラクタ</p> * <p>[詳 細] 列挙型のインスタンス生成を抑止します。</p> * <p>[備 考] </p> */ private EnumNumber( Integer num ) { this.num = num; } /** * <p>[概 要] 番号を取得する。</p> * <p>[詳 細] </p> * <p>[備 考] </p> * @return 番号 */ public Integer getValue() { return this.num; } } |
上記の列挙型クラスから値を取得したい場合は以下のように指定します。
1 2 |
Integer num1 = EnumNumber.NUMBER_1.getValue(); Integer num2 = EnumNumber.NUMBER_2.getValue(); |
さて、上記ソースでは列挙型へ番号だけを指定しましたが、実業務では番号に対応した内容(文字列など)を定義する必要が生じてくる事も良くあります。そういう場合は以下のように列挙型で指定した定数の()内で,区切りで指定する事でその定数に対応した値を複数指定する事も出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
/** * <p>[概 要] 番号の列挙型クラス</p> * <p>[詳 細] </p> * <p>[備 考] </p> */ public enum EnumNumber { NUMBER_1(Integer.valueOf(1), "番号1", Boolean.TRUE), NUMBER_2(Integer.valueOf(2), "番号2", Boolean.FALSE); private Integer num; private String name; private Boolean flg; /** * <p>[概 要] プライベートコンストラクタ</p> * <p>[詳 細] 列挙型のインスタンス生成を抑止します。</p> * <p>[備 考] </p> */ private EnumNumber( Integer num, String name, Boolean flg ) { this.num = num; this.name = name; this.flg = flg; } /** * <p>[概 要] 番号を取得する。</p> * <p>[詳 細] </p> * <p>[備 考] </p> * @return 番号 */ public Integer getNumber() { return this.num; } /** * <p>[概 要] 名称を取得する。</p> * <p>[詳 細] </p> * <p>[備 考] </p> * @return 名称 */ public String getName() { return this.name; } /** * <p>[概 要] フラグを取得する。</p> * <p>[詳 細] </p> * <p>[備 考] </p> * @return フラグ */ public Boolean getFlg() { return this.flg; } } |
1 2 3 4 5 6 |
Integer num1 = EnumNumber.NUMBER_1.getNumber(); String name1 = EnumNumber.NUMBER_1.getName(); Boolean flg1 = EnumNumber.NUMBER_1.getFlg(); Integer num2 = EnumNumber.NUMBER_2.getNumber(); String name2 = EnumNumber.NUMBER_2.getName(); Boolean flg2 = EnumNumber.NUMBER_2.getFlg(); |
定数クラスでは上記6つの定数を定義する場合、以下の様に6行分指定する必要がありますので、定数クラスでは可読性が落ちるのがお分かりになるかと思います。
1 2 3 4 5 6 |
public static final Integer NUMBER_1 = 1; public static final String NAME_1 = "番号1"; public static final Boolean FLG_1 = Boolean.TRUE; public static final Integer NUMBER_2 = 2; public static final String NAME_2 = "番号2"; public static final Boolean FLG_2 = Boolean.FALSE; |
いかがでしょうか?
列挙型を使用すれば多少コードは長くなるものの、定数クラスなどに比べて可読性/保守性に優れているというのを感じて頂ければ幸いです。