カテゴリー
コンピューター

【Java8 くらい】Enum についてのお勉強。可能性を探る

enum クラスの基本的な理解

  • enum クラスは、複数の定数をまとめるのに役立つクラス
  • enum クラスに記述する各定数の呼び方いろいろ
  • 定数名と定数値を定義したいだけの場合ならば、無理して使用する必要はないと思う。
    • すべての定数で、定数名 = 定数値、ならばよいと思う。
    • 定数名と定数値が異なる場合、もちろん定義すればよいのだが、コンストラクタと定数値へアクセスするためのメソッドを定義しなければならなくなる。面倒
  • 1 つの定数に対して、定数値などを複数持たせたいとき、enum クラスが活躍する。

enum 定数の宣言の仕方、使い方

  • enum 定数名として使用できないもの
    数値 (1 や 999 など、数字だけで構成された enum 定数は NG)
  • 文字列 (要するに、ダブルクォーテーションで囲ってはダメ。”aaa” は NG。 aaa ならば OK)
  • enum クラス名.enum 定数 で定数名にアクセスする。
  • enum クラス名.enum 定数.メソッド() で定数値などにアクセスする。
  • 定数値など、は必要ないなら定義しなくても良い。
    定数値などが必要ない場合というのは、enum 定数名そのものが、定数値である場合。
    例えば、Java プログラム内で “SUNDAY” といった enum 定数名と同じ文字列が定数値であれば、定数名のみの定義で充分。
    ただ、実際には、enum 定数名: SUNDAY、enum 定数値: 0、といった使い方をすることが多いと思う。
  • 変数に格納するときの型は、enum クラスとなる。
    そして、enum 定数はそのまま文字列を書く。メソッドではないのでカッコ () は付けない。
    DayOfTheWeek day = DayOfTheWeek.SUNDAY
  • enum 定数の正体は static フィールド(static 変数、クラス変数) である。

enum クラスとは一体何なのか?

  • enum クラスとは、ちょっと特殊というだけで、クラスである。
  • class ではなく、enum と宣言することで自動的に java.lang.Enum を extends する。
  • enum クラスのなにかにアクセスするには、大体なんでもかんでも基本的に static 変数、static メソッドとなる。
  • enum 定数として宣言した定数は、enum クラスの public static final なフィールドとして扱われる。

次の enum クラスをコンパイルしたものを逆コンパイルすると、上記のポイントを理解することができました。

public enum DayOfTheWeek {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY;
}
javac .\DayOfTheWeek.java
javap .\DayOfTheWeek.class`
public final class DayOfTheWeek extends java.lang.Enum<DayOfTheWeek> {
  public static final DayOfTheWeek Sunday;
  public static final DayOfTheWeek Monday;
  public static final DayOfTheWeek Tuesday;
  public static final DayOfTheWeek Wednesday;
  public static final DayOfTheWeek Thursday;
  public static final DayOfTheWeek Friday;
  public static final DayOfTheWeek Saturday;
  public static DayOfTheWeek[] values();
  public static DayOfTheWeek valueOf(java.lang.String);
  static {};
}

おわりに

enum クラスは定数を定義するのに使う。

理解はできますけれども、シンプルに定数クラスを作ってそこで定義するのと何が違うのでしょうか?しかも、定数値が定数名と一致しない場合はコンストラクタや定数値へアクセスするためのメソッドを定義しなければならず、面倒です。

そんなふうに感じており、今まで enum クラスはあまり使ってきませんでした。

しかし、次の本の、区分オブジェクト、という考え方を知り、見方が変わってきました。

    • 第2章 場合分けのロジックを整理する

区分オブジェクトについて掘り下げる前に、今回は enum そのものについて勉強いたしました。

以上です。

コメントを残す