enum1.誕生の背景

今日は、Java の別の種類のデータ型について説明しますenum。名前はenumeration というenum単語に由来します。このデータ型は何ですか?またその目的は何ですか?

場合によっては、プログラマは、可能な値が小さな固定リストに制限されている新しいデータ型を作成する必要があります。

たとえば、DayOfTheWeek型は値MONDAYTUESDAYWEDNESDAY、... のみを取ることができます。値は合計 7 つあります。または、Month型は値JANUARYFEBRUARYMARCH、... のみを取ることができます。値は合計 12 個あります。

もちろん、- 月曜日、 - 火曜日などの数字 (intタイプ)を使用します。しかし、誰かが誤って や などの無効な値を変数に割り当ててしまう可能性があります。1280

あるプログラマーが曜日 (または月) の番号が 0 から始まると考えている一方で、他のプログラマーは番号が 1 から始まることを期待している、などの状況が簡単に発生します。

Java が、有限の値セットenumで構成されるデータ型を導入したのはこのためです。


2. 型の宣言

新しいenumデータ型の宣言は次のようになります。

enum TypeName
{
   VALUE1,
   VALUE2,
   VALUE3
}

ここでTypeName、 は新しい型 (クラス) の名前であり、使用可能な値はコンマで区切られ、中括弧で囲まれています: Value1Value2Value3

例として、独自の を作成してみましょうDayOfTheWeek enum

コード ノート
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY
}
新型Dayタイプ

月曜
火曜
水曜
木曜

土曜
日曜

新しい型の変数に値を割り当てる方法は次のとおりです。

Day day = Day.MONDAY;

例:

コード ノート
Day day = Day.FRIDAY;
System.out.println(day);
画面出力は次のようになります。
FRIDAY


3. 方法enum

型にenumはいくつかの組み込みメソッドがあり、そのうちの 2 つは非常に興味深いものです。

静的values()メソッドは、次の型のすべての値の配列を返しますenum

コード ノート
Day[] days = Day.values();

for (Day day: days)
   System.out.println(day);







System.out.println(days[2]);
変数には、型 (7 要素)daysの値を含む配列が格納されます。 配列の内容を画面に表示します。Day


MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

このordinal()メソッドは定数の序数を返します。enumクラスではなく値で呼び出しますenum

コード コンソール出力
System.out.println(Day.MONDAY.ordinal());
System.out.println(Day.FRIDAY.ordinal());
System.out.println(Day.SUNDAY.ordinal());
0
4
6


4. クラスへの変換

実際には、ここには魔法のようなものは何もありません。コンパイラは、構文糖衣を提供しただけです。コンパイル時に、Day列挙型は通常のクラスに変換されます。

コード、簡易版 ノート
public class Day
{
   public static final Day MONDAY = new Day(0);
   public static final Day TUESDAY = new Day(1);
   public static final Day WEDNESDAY = new Day(2);
   public static final Day THURSDAY = new Day(3);
   public static final Day FRIDAY = new Day(4);
   public static final Day SATURDAY = new Day(5);
   public static final Day SUNDAY = new Day(6);

    private static final Day[] array = {MONDAY, TUESDAY,
      WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};

   private final int value;

   private Day (int value)
   {
      this.value = value;
   }

   public int ordinal()
   {
      return this.value;
   }

   public static Day[] values()
   {
      return array;
   }
}
Dayclass

静的定数のリストenum







のすべての値を含む配列特定のオブジェクト の値を格納する変数 クラスはプライベートです。つまり、クラスのオブジェクトはクラス内でのみ作成できます。 メソッドはオブジェクトに対して呼び出す必要があります。 オブジェクトの値、つまりフィールドを返します。このメソッドは、クラス のすべての値を含む静的配列を返します。Day


Day

DayconstructorDayDay



ordinalDay

value


Day

クラスからすべての静的メソッドと変数を削除するとDay、次のようになります。

コード ノート
public class Day
{
  private int value;

  private Day (int value)
  {
    this.value = value;
  }

  public int ordinal()
  {
    return this.value;
  }
}


変数にはオブジェクトvalueの値が格納されます。コンストラクターは であるため、オブジェクトはクラス内でのみ作成できます。 このメソッドはオブジェクトのを返します。 Day

DayDayprivate




ordinal()valueDay

言い換えれば、ここでは何も恐ろしいことは起こっていません。コンパイラはDayクラスを作成し、値を表す定数を追加しenum、必要なメソッドを追加して、クラス コンストラクター を作成しますprivate。コンストラクターがどのように機能するかについては、少し後で見ていきます。

この方法で変数に値を代入する理由が明らかになったと幸いです。

Day day = Day.MONDAY;

MONDAYはクラス内の単なる静的フィールド (定数) ですDay。クラスの外部から静的メソッドおよびフィールドにアクセスする場合は、フィールドまたはメソッドの名前の前にクラス名を指定する必要があります。



5. その他の方法enum

どのenumクラスにもいくつかの興味深い機能があります。

文字列との変換

enum オブジェクトを文字列に変換するには、そのtoString()メソッドを呼び出す必要があります。

String str = Day.MONDAY.toString();

逆の方向 (文字列からオブジェクトDay) に変換するには、静的valueOf()メソッドを使用できます。

Day day = Day.valueOf("MONDAY");

非常に便利なので、多くの場合に役立ちます。

数値に変換して再度数値に戻す

enumオブジェクトを数値に変換する方法はすでに知っています。ordinal()メソッドを呼び出します。

int index = Day.MONDAY.ordinal();

逆の方向 (数値からオブジェクトDay) に変換するには、より透明な構造が必要です。

Day day = Day.values()[2];

例:

コード ノート
Day day = Day.MONDAY;
int index = day.ordinal();
Day newDay = Day.values()[index+2];
Monday
月曜日のインデックスを取得します: 0
月曜日の 2 日後の曜日

重要な点:enum値は定数の固定セットであるため、 == を使用して比較できます。つまり、MONDAY異なるアドレスを持つ 2 つの同一のオブジェクトを持つことはできません。各列挙値のインスタンスは 1 つだけ存在します。つまり、== を使用した enum 変数の比較は常に機能します。



6. 独自のメソッドをenum

enuman はコンパイル時に通常のクラスに変わるため、その中でメソッドを宣言できます。これらのメソッドは、コンパイラーが生成するクラスに単純に追加されます。たとえば、Day enum配列ではなく列挙値のリストを返したいとします。

次に、次のコードを追加します。

コード ノート
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY;

   public static List<Day> asList()
   {
      ArrayList<Day> list = new ArrayList<Day>();

      Collections.addAll(list, values());

      return list;
   }

}








値のリストの後にはセミコロンが必要です。オブジェクト



を作成します。メソッド によって返された配列に値を追加します。 リストを返します。 ArrayList

values()

これで、このメソッドをコード内で呼び出すことができます。

コード ノート
List<Day> list = Day.asList();
変数listには、 のすべての値のリストが保存されますDay enum