enum
1.誕生の背景
今日は、Java の別の種類のデータ型について説明しますenum
。名前はenumeration というenum
単語に由来します。このデータ型は何ですか?またその目的は何ですか?
場合によっては、プログラマは、可能な値が小さな固定リストに制限されている新しいデータ型を作成する必要があります。
たとえば、DayOfTheWeek
型は値MONDAY
、TUESDAY
、WEDNESDAY
、... のみを取ることができます。値は合計 7 つあります。または、Month
型は値JANUARY
、FEBRUARY
、MARCH
、... のみを取ることができます。値は合計 12 個あります。
もちろん、- 月曜日、 - 火曜日などの数字 (int
タイプ)を使用します。しかし、誰かが誤って や などの無効な値を変数に割り当ててしまう可能性があります。1
2
8
0
あるプログラマーが曜日 (または月) の番号が 0 から始まると考えている一方で、他のプログラマーは番号が 1 から始まることを期待している、などの状況が簡単に発生します。
Java が、有限の値セットenum
で構成されるデータ型を導入したのはこのためです。
2. 型の宣言
新しいenum
データ型の宣言は次のようになります。
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
ここでTypeName
、 は新しい型 (クラス) の名前であり、使用可能な値はコンマで区切られ、中括弧で囲まれています: Value1
、Value2
、Value3
。
例として、独自の を作成してみましょうDayOfTheWeek
enum
。
コード | ノート |
---|---|
|
新型Day タイプ月曜 火曜 水曜 木曜 金 土曜 日曜 |
新しい型の変数に値を割り当てる方法は次のとおりです。
Day day = Day.MONDAY;
例:
コード | ノート |
---|---|
|
画面出力は次のようになります。
|
3. 方法enum
型にenum
はいくつかの組み込みメソッドがあり、そのうちの 2 つは非常に興味深いものです。
静的values()
メソッドは、次の型のすべての値の配列を返しますenum
。
コード | ノート |
---|---|
|
変数には、型 (7 要素)days の値を含む配列が格納されます。 配列の内容を画面に表示します。Day
|
このordinal()
メソッドは定数の序数を返します。enum
クラスではなく値で呼び出しますenum
。
コード | コンソール出力 |
---|---|
|
|
4. クラスへの変換
実際には、ここには魔法のようなものは何もありません。コンパイラは、構文糖衣を提供しただけです。コンパイル時に、Day
列挙型は通常のクラスに変換されます。
コード、簡易版 | ノート |
---|---|
|
Day class静的定数のリストenum のすべての値を含む配列特定のオブジェクト の値を格納する変数 クラスはプライベートです。つまり、クラスのオブジェクトはクラス内でのみ作成できます。 メソッドはオブジェクトに対して呼び出す必要があります。 オブジェクトの値、つまりフィールドを返します。このメソッドは、クラス のすべての値を含む静的配列を返します。 Day Day Day constructor Day Day ordinal Day value Day |
クラスからすべての静的メソッドと変数を削除するとDay
、次のようになります。
コード | ノート |
---|---|
|
変数にはオブジェクト value の値が格納されます。コンストラクターは であるため、オブジェクトはクラス内でのみ作成できます。 このメソッドはオブジェクトのを返します。 Day Day Day private ordinal() value Day |
言い換えれば、ここでは何も恐ろしいことは起こっていません。コンパイラは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];
例:
コード | ノート |
---|---|
|
Monday 月曜日のインデックスを取得します: 0 月曜日の 2 日後の曜日 |
重要な点:enum
値は定数の固定セットであるため、 == を使用して比較できます。つまり、MONDAY
異なるアドレスを持つ 2 つの同一のオブジェクトを持つことはできません。各列挙値のインスタンスは 1 つだけ存在します。つまり、== を使用した enum 変数の比較は常に機能します。
6. 独自のメソッドをenum
enum
an はコンパイル時に通常のクラスに変わるため、その中でメソッドを宣言できます。これらのメソッドは、コンパイラーが生成するクラスに単純に追加されます。たとえば、Day enum
配列ではなく列挙値のリストを返したいとします。
次に、次のコードを追加します。
コード | ノート |
---|---|
|
値のリストの後にはセミコロンが必要です。オブジェクト を作成します。メソッド によって返された配列に値を追加します。 リストを返します。 ArrayList values() |
これで、このメソッドをコード内で呼び出すことができます。
コード | ノート |
---|---|
|
変数list には、 のすべての値のリストが保存されますDay enum 。 |
GO TO FULL VERSION